This notebook aims at exploring the Cetacean occurrence dataset from the PaleoBiology DataBase (PBDB), looking for potential biases invalidating to our model assumptions and how to mitigate them. Subsampling this dataset will allow (1) to reduce the computational burden of our analysis and (2) to compensate for the biases mentioned above.
Mitigate the abundance bias
To quantify more precisely this bias, we will:
- Count the number of occurrences for each taxon
- Obtain the stratigraphic range of each taxa - ie. the time interval in which a taxon is observed - by combining the stratigraphic age uncertainties of its occurrences
- Compute the density of occurrences = nb of occurrences / stratigraphic range, expressed in “number of occurrences by million years”
Compute the occurrence density
Count occurrences by accepted name
Count the number of occurrences with the same accepted name and plot their distribution.


\(\to\) Some occurrences have too much age uncertainty (unrelated to taxon longevity in extreme cases like the one spanning 60My), they risk to artificially increase species duration.
BIAS CORRECTION N°2: Exclude occurrences with highly uncertain dating (> 10My)

Most of occurrences show less than 10 My age uncertainty, let’s keep only these ones.


\(\to\) The removal of highly uncertain occurrences seems to be only a little biased, even if uncertainty globally increases with age.


\(\to\) Some taxa have several occurrences with distinct age uncertainty intervals, let’s combine them into a unique stratigraphic range.
Stratigraphic ranges = unique time interval combining age uncertainties of occurrences of the same taxon (excluding the most uncertain ones)


Density distributions
Plot the density of occurrences (= number of occurrences by unit of time, in the stratigraphic interval of a taxon) for each taxonomic rank.

\(\to\) Density logically increases with taxa ranks, but the distributions for species and genera dramatically spread over two orders of magnitude.
Correlation between occurrence density and age
If we want to correct species abundance differences based on the density of occurrences in the age interval, those factors should not depend on time in order to avoid penalizing periods with higher densities.
Let’s compare the occurrence densities computed with the initial time ranges and the combined densities computed with the combined stratigraphic ranges.


\(\to\) The density based on combined ranges seems less time-dependent than the density based on initial time ranges. We will therefore use the combined density for our corrections.
BIAS CORRECTION N°3: Subsample occurrences by homogenizing the combined occurrence density
Subsampling by homogenization = reducing the discrepancy between high and low occurrence densities among taxa by subsampling preferentially the densest ones.
Compare densities by accepted name count (species only)
Let’s focus now on the occurrences accepted at the species level because they are the one for which we can correct the abundance bias by subsampling the most concentrated combined intervals.

\(\to\) Their is a huge span of densities driven by the number of occurrences for the same species that we can reduce by subsampling the most concentrated intervals.
Impact of correcting subsampling on density distributions (species only)

\(\to\) Subsampling by homogenization successfully reduces the density span from 2 to 1 order of magnitude.
Impact of subsampling on occurrences repartition (species only)
See what our distributions look like after subsampling:

\(\to\) Some highly dense cluster became much more similar to the others.


If we superpose these 2 plots:

\(\to\) We get the new species occurrence distribution after subsampling, that could be used for doing inference with the occurrence birth-death model.
Compare with a Poisson sampling process
In order to check if the data fit our assumptions of constant-fossilization-rate Poisson sampling we compare the observed occurrences distributions with the expected ones. Specifically, we will look at the number of taxa represented by 1, 2, 3, … occurrences and the one that we would expect for a given distribution of stratigraphic ranges (seen here as a proxy for species duration).


In a Poisson process with occurrence sampling rate \(\omega\) and for a given time interval of length \(t\), the probability of observing \(N_t = k\) occurrences is given by the Poisson distribution of mean of parameter \(\omega\times t\):
\[\mathbb{P}(N_t=k) = e^{-\omega t}\frac{(\omega t)^k}{k!}\]
So in order to have the absolute probability of observing \(N_0 = n\) occurrences we have to integrate over the full distribution of age uncertainties \(t\), called \(f(t)\):
\[\mathbb{P}(N_0 = n) = \int_t P(N_t = n) f(t) dt = \int_t e^{-\omega t}\frac{(\omega t)^n}{n!} f(t) dt\]
First, approximate this distribution:

Then integrate and plot the expected distribution for a given omega:

Finally, try to find an \(\omega\) value that approximately fits the first points (the least affected by oversampling biases) and check if the other points follow the expected curve:


\(\implies\) Initial observations really do not fit the expectations, species with more than 5 occurrences must remain very rare ! But our subsampling seems to correct most of this bias.
However, this method requires to make several arbitrary choices that may introduce new biases so we will instead subsample at other levels (palaeontological collection, geological formation). In each case only one occurrence will be sampled for the similarly identified, a process we will refer to as aggregating these occurrences according to the chosen factor.
BIAS CORRECTION N°3bis: Subsample occurrences by aggregating similarly identified occurrences in each collection
Subsampling by aggregation = aggregate all the occurrences of a given taxon according to a given criterion (collection, geological formation, country, geological plate).
Wrong track: Aggregate similarly identified occurrences in each collection
In order to reduce the abundance bias, we may keep only one occurrence for each collection:
\(\to\) Not enough occurrences are removed to make a sufficient difference. If we look at the collection with the highest number of occurrences:
Aprixokogia kelloggi Balaena Balaenoptera acutorostrata
1 2 2
Balaenopteridae Balaenula Bohaskaia monodontoides
2 2 1
Cetotheriinae Delphinapterus Delphinidae
1 3 2
Delphinus Globicephala Gricetoides aurorae
2 2 1
Herpetocetinae Herpetocetus sendaicus Herpetocetus transatlanticus
1 1 1
Kogia breviceps Kogiidae Kogiinae
1 1 2
Kogiopsis floridana Lagenorhynchus Lagenorhynchus harmatuki
1 2 1
Megaptera Mesoplodon longirostris Monodon
2 2 1
Ninoziphius platyrostris Orycterocetus Physeter macrocephalus
3 1 1
Physeteridae Physeterinae Physeterula dubusi
1 2 1
Plesiocetus Pliopontos littoralis Pontoporia
1 1 1
Pontoporiidae Pseudorca Scaldicetus
2 2 1
Stenella Stenella rayi Tursiops
2 1 2
Ziphius cavirostris
2
\(\to\) There are very few redundancies among the accepted names in collections so aggregating those won’t reduce the abundance bias.
Instead, we may try to aggregate occurrences with the same accepted name at the level of the geological formation (ie subsample only one for each).
Check that the sampling methods do not introduce biases in the repartition between Odontoceti and Mysticeti
Mystecetes are usually larger than odontocetes, and size is associated with a wider geographic range so since we are subsampling occurrences according to geological formation we may be biasing our data towards more widespread species, therefore towards mystecetes.
Look at the families first:

\(\to\) The family distributions vary a bit after subsampling, but because of the limited number of species by family the fact that we corrected the oversampling of some species could have a disproportionate effect.
Let’s look rather at a higher taxonomic rank, by importing the topology of cetacean families (from Marx et al. 2016):


\(\to\) There is a smaller proportion of archeocete occurrences after either sampling, because a huge cluster is subsampled around 35 My ago, but this effect is expected. However, for the Mysticeti vs. Odotoceti there is no huge apparent bias, especially with the aggregating method.

Faster genus-level analysis
Apply the same transformations at the generic level to perform the analysis faster.
More occurrences remain after aggregating with this new method. Let’s compare again with the theoretical distribution:


\(\to\) The correspondence is much less improved than with species aggregation because some genera have a lot of occurrences due to their high number of species:
Balaenoptera Kentriodon Mesoplodon Scaldicetus Squalodon
53 27 30 41 40
Removed 2 rows containing missing values (geom_bar).Removed 2 rows containing missing values (geom_bar).

\(\to\) Delimiting by geological plates (+ age) instead of countries (+ age) leads to similar distributions, with a bit more occurrences.
LS0tCnRpdGxlOiAiRm9ybWF0IENldGFjZWFucyBEYXRhIgpvdXRwdXQ6CiAgcGRmX2RvY3VtZW50OiAKICAgIGZpZ19oZWlnaHQ6IDUuNQogICAgZmlnX3dpZHRoOiAxMAogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogNAogIGh0bWxfbm90ZWJvb2s6CiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICBodG1sX2RvY3VtZW50OgogICAgZmlnX3dpZHRoOiAxMAogICAgdG9jOiB5ZXMKLS0tCgpDcmVhdGlvbiAtIGplcmVteS5hbmRyZW9sZXR0aUBlbnMuZnIgLSAxMy8wNC8yMDIwCgpUaGlzIG5vdGVib29rIGFpbXMgYXQgZXhwbG9yaW5nIHRoZSBDZXRhY2VhbiBvY2N1cnJlbmNlIGRhdGFzZXQgZnJvbSB0aGUgUGFsZW9CaW9sb2d5IERhdGFCYXNlIChQQkRCKSwgbG9va2luZyBmb3IgcG90ZW50aWFsIGJpYXNlcyBpbnZhbGlkYXRpbmcgdG8gb3VyIG1vZGVsIGFzc3VtcHRpb25zIGFuZCBob3cgdG8gbWl0aWdhdGUgdGhlbS4gU3Vic2FtcGxpbmcgdGhpcyBkYXRhc2V0IHdpbGwgYWxsb3cgKDEpIHRvIHJlZHVjZSB0aGUgY29tcHV0YXRpb25hbCBidXJkZW4gb2Ygb3VyIGFuYWx5c2lzIGFuZCAoMikgdG8gY29tcGVuc2F0ZSBmb3IgdGhlIGJpYXNlcyBtZW50aW9uZWQgYWJvdmUuCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSkKYGBgCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KCJnZ3Bsb3QyIikKbGlicmFyeSgiZHBseXIiKQpsaWJyYXJ5KCJnZ3RyZWUiKQpgYGAKCiMgTG9hZCBvY2N1cnJlbmNlIGRhdGFzZXQKCmBgYHtyLCBpbmNsdWRlPUZ9CiMgY2V0YWNlYV9wYmRiIDwtIHJlYWQuY3N2KCIuLi9kYXRhLWNldGFjZWFucy9jZXRhY2VhX3BiZGJfMDVfQXByXzIwMTguY3N2Iiwgc2tpcCA9IDE2KQpjZXRhY2VhX3BiZGIgPC0gcmVhZC5jc3YyKCIuLi9kYXRhLWNldGFjZWFucy9jZXRhY2VhX3BiZGJfMTFfTWF5XzIwMjAuY3N2Iiwgc2tpcCA9IDE3KQojIFJlbW92ZSBjb2x1bW5zIHdpdGggb25seSBOQXMKY2V0YWNlYV9wYmRiIDwtIGNldGFjZWFfcGJkYlssY29sU3Vtcyhpcy5uYShjZXRhY2VhX3BiZGIpKSA8IG5yb3coY2V0YWNlYV9wYmRiKV0KIyBSZWNvcmQgY2xhc3N5aW5nIG51bWJlcnMgYXMgZmFjdG9ycwpjZXRhY2VhX3BiZGJbLCBncmVwKCJfbm8iLCBuYW1lcyhjZXRhY2VhX3BiZGIpLCB2YWx1ZSA9IFQpXSA8LSBkYXRhLmZyYW1lKHNhcHBseShjZXRhY2VhX3BiZGJbLCBncmVwKCJfbm8iLCBuYW1lcyhjZXRhY2VhX3BiZGIpLCB2YWx1ZSA9IFQpXSwgYXMuZmFjdG9yKSkKIyBSZWNvcmQgbnVtZXJpYyBxdWFudGl0aWVzIGFzIGRvdWJsZXMKY2V0YWNlYV9wYmRiWywgYygibGF0IiwgImxuZyIsICJwYWxlb2xhdCIsICJwYWxlb2xuZyIsICJtaW5fbWEiLCAibWF4X21hIildIDwtIHNhcHBseShjZXRhY2VhX3BiZGJbLCBjKCJsYXQiLCAibG5nIiwgInBhbGVvbGF0IiwgInBhbGVvbG5nIiwgIm1pbl9tYSIsICJtYXhfbWEiKV0sIGZ1bmN0aW9uKGNvbCl7YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoY29sKSl9KQojIHN1bW1hcnkoY2V0YWNlYV9wYmRiW2dyZXAoImNvbW1lbnQiLCBuYW1lcyhjZXRhY2VhX3BiZGIpLCB2YWx1ZSA9IFQsIGludmVydD1UKV0pCm5hbWVzKGNldGFjZWFfcGJkYikKYGBgCgpgYGB7ciwgaW5jbHVkZT1GfQpoZWFkKGNldGFjZWFfcGJkYikKYGBgCgpgYGB7ciwgaW5jbHVkZT1GfQojIFJlb3JkZXIgYWNjZXB0ZWQgcmFua3MgYWNjb3JkaW5nIHRvIGNsYXNzaWZpY2F0aW9uIHN0YW5kYXJkLgoKbGV2ZWxzKGNldGFjZWFfcGJkYiRhY2NlcHRlZF9yYW5rKQpjZXRhY2VhX3BiZGIkYWNjZXB0ZWRfcmFuayA8LSBmYWN0b3IoY2V0YWNlYV9wYmRiJGFjY2VwdGVkX3JhbmssIGxldmVscz1jKCJzdWJzcGVjaWVzIiwgInNwZWNpZXMiLCAiZ2VudXMiLCAic3ViZmFtaWx5IiwgImZhbWlseSIsICJzdXBlcmZhbWlseSIsICJpbmZyYW9yZGVyIiwgInN1Ym9yZGVyIiwgIm9yZGVyIiwgInVucmFua2VkIGNsYWRlIikpCmNldGFjZWFfcGJkYiRpZGVudGlmaWVkX3JhbmsgPC0gZmFjdG9yKGNldGFjZWFfcGJkYiRpZGVudGlmaWVkX3JhbmssIGxldmVscz1jKCJzdWJzcGVjaWVzIiwgInNwZWNpZXMiLCAiZ2VudXMiLCAic3ViZmFtaWx5IiwgImZhbWlseSIsICJzdXBlcmZhbWlseSIsICJpbmZyYW9yZGVyIiwgInN1Ym9yZGVyIiwgIm9yZGVyIiwgInVucmFua2VkIGNsYWRlIikpCmBgYAoKIyBMb2FkIHRoZSBsaXN0IG9mIG9jY3VycmVuY2VzIHdpdGggbW9ycGhvbG9naWNhbCBpbmZvcm1hdGlvbgoKVGhlc2UgYXJlIHRoZSBzcGVjaW1lbnMgdGhhdCBhcmUgYWxyZWFkeSBpbmNsdWRlZCBpbiB0aGUgdHJlZSB0aGFua3MgdG8gdGhlaXIgbW9ycGhvbG9naWNhbCBjaGFyYWN0ZXJzLCBhbmQgbXVzdCB0aGVyZWZvcmUgYmUgcmVtb3ZlZCBmcm9tIHRoZSBvY2N1cnJlbmNlIGRhdGFzZXQuCgpgYGB7ciwgaW5jbHVkZT1GfQpvY2N1cnJlbmNlc193aXRoX21vcnBob2xvZ3kgPC0gcmVhZC5jc3YyKCIuLi9kYXRhLWNldGFjZWFucy9TcGVjaW1lbnNQQkRCX25ld05hbWVzLmNzdiIpCnN1bW1hcnkob2NjdXJyZW5jZXNfd2l0aF9tb3JwaG9sb2d5KQpgYGAKCkNvbWJpbmUgdGhlc2UgdGF4YSB3aXRoIGV4dGFudCB0YXhhIHRvIGdldCBhbGwgdGhlIHNwZWNpZXMgaW5jbHVkZWQgaW4gdGhlIHRyZWUuCgpgYGB7ciwgaW5jbHVkZT1GfQpleHRhbnRfdGF4YSA8LSByZWFkLmNzdjIoIi4uL2RhdGEtY2V0YWNlYW5zL0NldGFjZWFfZXh0YW50X3RheGEuY3N2IikKc3VtbWFyeShleHRhbnRfdGF4YSkKYGBgCgpgYGB7ciwgaW5jbHVkZT1GfQpleHRpbmN0X3RheGEgPC0gY2V0YWNlYV9wYmRiW2NldGFjZWFfcGJkYiRvY2N1cnJlbmNlX25vICVpbiUgb2NjdXJyZW5jZXNfd2l0aF9tb3JwaG9sb2d5JHBiZGJfb2NjdXJlbmNlLm51bWJlciwgYygiYWNjZXB0ZWRfbmFtZSIsICJtaW5fbWEiLCAibWF4X21hIildCmV4dGluY3RfdGF4YSRhY2NlcHRlZF9uYW1lIDwtIGFzLmZhY3Rvcihnc3ViKCIgIiwgIl8iLCBleHRpbmN0X3RheGEkYWNjZXB0ZWRfbmFtZSkpCm5hbWVzKGV4dGluY3RfdGF4YSkgPC0gbmFtZXMoZXh0YW50X3RheGEpCnN1bW1hcnkoZXh0aW5jdF90YXhhKQpgYGAKCmBgYHtyLCBpbmNsdWRlPUZ9CnRheGEgPC0gcmJpbmQoZXh0YW50X3RheGEsIGV4dGluY3RfdGF4YSkKc3VtbWFyeSh0YXhhKQp3cml0ZS50YWJsZSh0YXhhLCBmaWxlID0gIi4uL2RhdGEtY2V0YWNlYW5zL0NldGFjZWFfdGF4YS5jc3YiLCBxdW90ZSA9IEYsIHNlcD0iXHQiLCByb3cubmFtZXMgPSBGKQpgYGAKCmBgYHtyLCBpbmNsdWRlPUZ9CiMgQ2hlY2sgdGhhdCB0aGUgbmFtZXMgaW4gdGhlIGRhdGFzZXRzIGFyZSBleGFjdGx5IHRoZSBzYW1lIGFzIGluIHRoZSBsaXN0IGFib3ZlLgoKbW9ycGhvX25hbWVzIDwtIHJlYWQudGFibGUoIi4uL2RhdGEtY2V0YWNlYW5zL21vcnBob19zaW1wbGlmaWVkX25ld05hbWVzX3JlbW92ZU91dGdyb3Vwc1VuZGVzY3JpYmVkLm5leCIsIHNraXA9NiwgZmlsbD1UKQptb3JwaG9fbmFtZXMgPC0gZHJvcGxldmVscyhtb3JwaG9fbmFtZXMkVjFbc2FwcGx5KG1vcnBob19uYW1lcyRWMSwgZ3JlcGwsIHBhdHRlcm49Il8iKV0pCgptaXRfbmFtZXMgPC0gcmVhZC50YWJsZSgiLi4vZGF0YS1jZXRhY2VhbnMvTTQzNzZfbXRfc2ltcGxpZmllZF9uZXdOYW1lc19yZW1vdmVPdXRncm91cHMubmV4Iiwgc2tpcD02LCBmaWxsPVQpCm1pdF9uYW1lcyA8LSBkcm9wbGV2ZWxzKG1pdF9uYW1lcyRWMVtzYXBwbHkobWl0X25hbWVzJFYxLCBncmVwbCwgcGF0dGVybj0iXyIpXSkKCm51Y19uYW1lcyA8LSByZWFkLnRhYmxlKCIuLi9kYXRhLWNldGFjZWFucy9NNDM1OF9udWNsZWFyX3NpbXBsaWZpZWRfbmV3TmFtZXNfcmVtb3ZlT3V0Z3JvdXBzLm5leCIsIHNraXA9NiwgZmlsbD1UKQpudWNfbmFtZXMgPC0gZHJvcGxldmVscyhudWNfbmFtZXMkVjFbc2FwcGx5KG51Y19uYW1lcyRWMSwgZ3JlcGwsIHBhdHRlcm49Il8iKV0pCgojIENoZWNrIHRoYXQgYWxsIHRoZSBkYXRhc2V0cyBjb250YWluIHRoZSBzYW1lIHRheGEgbmFtZXMKc2V0ZXF1YWwodGF4YSR0YXhvbiwgdW5pb24odW5pb24obW9ycGhvX25hbWVzLCBtaXRfbmFtZXMpLCBudWNfbmFtZXMpKQpgYGAKCklkZW0gYXQgdGhlIGdlbmVyaWMgbGV2ZWwgZm9yIHRoZSBnZW51cyBhbmFseXNpcy4KCmBgYHtyLCBpbmNsdWRlPUZ9Cm9jY3VycmVuY2VzX3dpdGhfbW9ycGhvbG9neV9nZW5lcmEgPC0gb2NjdXJyZW5jZXNfd2l0aF9tb3JwaG9sb2d5Wy13aGljaChvY2N1cnJlbmNlc193aXRoX21vcnBob2xvZ3kkVGF4b24gJWluJSBjKCJBdG9jZXR1c19uYXNhbGlzIiwgIkJyYWNoeWRlbHBoaXNfamFodWF5ZW5zaXMiLCAiSGFib3JvcGhvY29lbmFfbWludXR1cyIsICJMb3Bob2NldHVzX3JlcGVubmluZ2kiLCAiT2RvYmVub2NldG9wc19wZXJ1dmlhbnVzIiwgIk90ZWthaWtlYV9odWF0YSIsICJQYXJhcG9udG9wb3JpYV93aWxzb25pIikpLF0KZXh0YW50X2dlbmVyYSA8LSByZWFkLmNzdjIoIi4uL2RhdGEtY2V0YWNlYW5zL0NldGFjZWFfZXh0YW50X2dlbmVyYS5jc3YiKQpzdW1tYXJ5KGV4dGFudF9nZW5lcmEpCgpleHRpbmN0X2dlbmVyYSA8LSBjZXRhY2VhX3BiZGJbY2V0YWNlYV9wYmRiJG9jY3VycmVuY2Vfbm8gJWluJSBvY2N1cnJlbmNlc193aXRoX21vcnBob2xvZ3lfZ2VuZXJhJHBiZGJfb2NjdXJlbmNlLm51bWJlciwgYygiYWNjZXB0ZWRfbmFtZSIsICJtaW5fbWEiLCAibWF4X21hIildCmV4dGluY3RfZ2VuZXJhJGFjY2VwdGVkX25hbWUgPC0gYXMuZmFjdG9yKGdzdWIoIiAiLCAiXyIsIGV4dGluY3RfZ2VuZXJhJGFjY2VwdGVkX25hbWUpKQpuYW1lcyhleHRpbmN0X2dlbmVyYSkgPC0gbmFtZXMoZXh0YW50X2dlbmVyYSkKc3VtbWFyeShleHRpbmN0X2dlbmVyYSkKCmdlbmVyYSA8LSByYmluZChleHRhbnRfZ2VuZXJhLCBleHRpbmN0X2dlbmVyYSkKc3VtbWFyeShnZW5lcmEpCndyaXRlLnRhYmxlKGdlbmVyYSwgZmlsZSA9ICIuLi9kYXRhLWNldGFjZWFucy9DZXRhY2VhX2dlbmVyYS5jc3YiLCBxdW90ZSA9IEYsIHNlcD0iXHQiLCByb3cubmFtZXMgPSBGKQpgYGAKCmBgYHtyLCBpbmNsdWRlPUZ9CiMgQ2hlY2sgdGhhdCB0aGUgbmFtZXMgaW4gdGhlIGRhdGFzZXRzIGFyZSBleGFjdGx5IHRoZSBzYW1lIGFzIGluIHRoZSBsaXN0IGFib3ZlLgoKbW9ycGhvX25hbWVzX2dlbmVyYSA8LSByZWFkLnRhYmxlKCIuLi9kYXRhLWNldGFjZWFucy9tb3JwaG9fc2ltcGxpZmllZF9uZXdOYW1lc19nZW5lcmFfcmVtb3ZlT3V0Z3JvdXBzVW5kZXNjcmliZWQubmV4Iiwgc2tpcD02LCBmaWxsPVQpCm1vcnBob19uYW1lc19nZW5lcmEgPC0gZHJvcGxldmVscyhtb3JwaG9fbmFtZXNfZ2VuZXJhJFYxW3NhcHBseShtb3JwaG9fbmFtZXNfZ2VuZXJhJFYxLCBncmVwbCwgcGF0dGVybj0iXyIpXSkKCm1pdF9uYW1lc19nZW5lcmEgPC0gcmVhZC50YWJsZSgiLi4vZGF0YS1jZXRhY2VhbnMvTTQzNzZfbXRfc2ltcGxpZmllZF9uZXdOYW1lc19nZW5lcmFfcmVtb3ZlT3V0Z3JvdXBzLm5leCIsIHNraXA9NiwgZmlsbD1UKQptaXRfbmFtZXNfZ2VuZXJhIDwtIGRyb3BsZXZlbHMobWl0X25hbWVzX2dlbmVyYSRWMVtzYXBwbHkobWl0X25hbWVzX2dlbmVyYSRWMSwgZ3JlcGwsIHBhdHRlcm49Il8iKV0pCgpudWNfbmFtZXNfZ2VuZXJhIDwtIHJlYWQudGFibGUoIi4uL2RhdGEtY2V0YWNlYW5zL000MzU4X251Y2xlYXJfc2ltcGxpZmllZF9uZXdOYW1lc19nZW5lcmFfcmVtb3ZlT3V0Z3JvdXBzLm5leCIsIHNraXA9NiwgZmlsbD1UKQpudWNfbmFtZXNfZ2VuZXJhIDwtIGRyb3BsZXZlbHMobnVjX25hbWVzX2dlbmVyYSRWMVtzYXBwbHkobnVjX25hbWVzX2dlbmVyYSRWMSwgZ3JlcGwsIHBhdHRlcm49Il8iKV0pCgojIENoZWNrIHRoYXQgYWxsIHRoZSBkYXRhc2V0cyBjb250YWluIHRoZSBzYW1lIHRheGEgbmFtZXMKc2V0ZXF1YWwoZ2VuZXJhJHRheG9uLCB1bmlvbih1bmlvbihtb3JwaG9fbmFtZXNfZ2VuZXJhLCBtaXRfbmFtZXNfZ2VuZXJhKSwgbnVjX25hbWVzX2dlbmVyYSkpCmBgYAoKUmVtb3ZlIHRob3NlIG9jY3VycmVuY2VzIGZyb20gb3VyIGluaXRpYWwgZGF0YXNldCB0byBhdm9pZCByZWR1bmRhbmN5LgoKYGBge3J9CmNldGFjZWFfcGJkYiA8LSBjZXRhY2VhX3BiZGJbIShjZXRhY2VhX3BiZGIkb2NjdXJyZW5jZV9ubyAlaW4lIG9jY3VycmVuY2VzX3dpdGhfbW9ycGhvbG9neSRwYmRiX29jY3VyZW5jZS5udW1iZXIpLF0KYGBgCgojIEV4cGxvcmUgdGhlIGRhdGFzZXQKIyMgUmVwYXJ0aXRpb24gdGhyb3VnaCB0aW1lCiMjIyBGdWxsIGZvc3NpbCByZWNvcmQKCkVhY2ggb2NjdXJyZW5jZSBpcyBhc3NvY2lhdGVkIHdpdGggYSAqKnN0cmF0aWdyYXBoaWMgYWdlIHVuY2VydGFpbnR5IGludGVydmFsKiogKG1pbmltdW0gYW5kIG1heGltdW0gYWdlcykuCgpgYGB7ciB9CiMgR2V0IHRoZSBzdHJhdGlncmFwaGljIGFnZSB1bmNlcnRhaW50eSBpbnRlcnZhbApjZXRhY2VhX3BiZGIkYWdlX3VuY2VydGFpbnR5X2ludGVydmFsIDwtIG1hcHBseShmdW5jdGlvbihtaW5fYWdlLCBtYXhfYWdlKXtwYXN0ZSgiWyIsLW1heF9hZ2UsIiwgIiwtbWluX2FnZSwiXSIsIHNlcCA9ICIiKX0sIGNldGFjZWFfcGJkYiRtaW5fbWEsIGNldGFjZWFfcGJkYiRtYXhfbWEpCgojIENvbXB1dGUgdGhlIG1lYW4gYWdlIGluIHRoZSBpbnRlcnZhbApjZXRhY2VhX3BiZGIkYWdlX21lYW4gPC0gKGNldGFjZWFfcGJkYiRtaW5fbWErY2V0YWNlYV9wYmRiJG1heF9tYSkvMgoKZ2dwbG90KGNldGFjZWFfcGJkYiwgYWVzKHg9LW1heF9tYSwgeT1hZ2VfdW5jZXJ0YWludHlfaW50ZXJ2YWwpKSArCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gLW1heF9tYSwgeSA9IHJlb3JkZXIoYWdlX3VuY2VydGFpbnR5X2ludGVydmFsLCAtYWdlX21lYW4pLCB4ZW5kID0gLW1pbl9tYSwgeWVuZD1yZW9yZGVyKGFnZV91bmNlcnRhaW50eV9pbnRlcnZhbCwgLWFnZV9tZWFuKSwgY29sb3I9LWFnZV9tZWFuKSkgKwogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIlRpbWUgKE15KSIpICsKICBzY2FsZV95X2Rpc2NyZXRlKG5hbWUgPSAiT2NjdXJyZW5jZXMiKSArCiAgbGFicyhjb2xvdXI9Ik1lYW4gYWdlIikgKwogIGdndGl0bGUoIkRpc3RyaWJ1dGlvbiBvZiBhZ2UgaW50ZXJ2YWxzIikgKwogIHRoZW1lKGF4aXMudGV4dC55PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzLnk9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgpGaXJzdCwgb25lIGNhbiB1c2UgdGhlIHN0cmF0aWdyYXBoaWMgYWdlIHVuY2VydGFpbnR5IGludGVydmFsIG1pZHBvaW50IGFzIHRoZSBvY2N1cnJlbmNlIGZpeGVkIGFnZS4KCmBgYHtyLCBmaWcuYXNwPTAuMywgZmlnLndpZHRoPTh9CmdncGxvdChjZXRhY2VhX3BiZGIsIGFlcyh4PS1hZ2VfbWVhbiwgeT1ybm9ybShsZW5ndGgoYWdlX21lYW4pLCAxLCAwLjA1KSkpICsKICBnZW9tX3BvaW50KGNleD0wLjEsIGFscGhhPTAuNSkgKwogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIlRpbWUgKE15KSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJPY2N1cnJlbmNlcyIsIGxpbWl0cyA9IGMoMC43LCAxLjMpKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJBY2NlcHRlZCByYW5rIikgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoc2l6ZSA9IDAuNSwgbGluZXR5cGUgPSAic29saWQiLCBjb2xvdXIgPSAiYmxhY2siKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKICBnZ3RpdGxlKHBhc3RlKCJSZXBhcnRpdGlvbiBvZiIsIGRpbShjZXRhY2VhX3BiZGIpWzFdLCAicmVjb3JkZWQgb2NjdXJyZW5jZXMgdGhyb3VnaCB0aW1lIC0gTWlkcG9pbnQiKSkKCmdncGxvdChjZXRhY2VhX3BiZGIsIGFlcyh4PS1hZ2VfbWVhbikpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiTnVtYmVyIG9mIG9jY3VycmVuY2VzIikgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZT0iQWNjZXB0ZWQgcmFuayIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKSArCiAgZ2d0aXRsZShwYXN0ZSgiRXZvbHV0aW9uIG9mIHRoZSBudW1iZXIgb2NjdXJyZW5jZXMgdGhyb3VnaCB0aW1lICggdG90YWwgb2YiLCBkaW0oY2V0YWNlYV9wYmRiKVsxXSwgIikgLSBNaWRwb2ludCIpKQpgYGAKCiRcdG8kIE51bWVyb3VzIG9jY3VycmVuY2VzIHNlZW0gdG8gaGF2ZSB0aGUgc2FtZSBzdHJhdGlncmFwaGljIGFnZSB1bmNlcnRhaW50eSBzbyBpbiBvcmRlciB0byBhdm9pZCBjbHVzdGVycyBsZXQncyBkcmF3IHRoZW0gdW5pZm9ybWx5IGluIHRoZWlyIGludGVydmFsIHJhdGhlciB0aGFuIHRha2luZyB0aGUgbWlkcG9pbnQuCgpgYGB7ciwgZmlnLmFzcD0wLjMsIGZpZy53aWR0aD04fQojIERyYXcgb2NjdXJyZW5jZSBhZ2UgdW5pZm9ybWFsbHkgaW4gdGhlIHVuY2VydGFpbnR5IGludGVydmFsCmNldGFjZWFfcGJkYiRhZ2VfcnVuaWYgPC0gbWFwcGx5KGZ1bmN0aW9uKG0sIE0pe3J1bmlmKG49MSwgbWluPW0sIG1heD1NKX0sIGNldGFjZWFfcGJkYiRtaW5fbWEsIGNldGFjZWFfcGJkYiRtYXhfbWEpCgpnZ3Bsb3QoY2V0YWNlYV9wYmRiLCBhZXMoeD0tYWdlX3J1bmlmLCB5PXJub3JtKGxlbmd0aChhZ2VfcnVuaWYpLCAxLCAwLjA1KSkpICsKICBnZW9tX3BvaW50KGNleD0wLjEsIGFscGhhPTAuNSkgKwogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIlRpbWUgKE15KSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJPY2N1cnJlbmNlcyIsIGxpbWl0cyA9IGMoMC43LCAxLjMpKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJBY2NlcHRlZCByYW5rIikgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoc2l6ZSA9IDAuNSwgbGluZXR5cGUgPSAic29saWQiLCBjb2xvdXIgPSAiYmxhY2siKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKICBnZ3RpdGxlKHBhc3RlKCJSZXBhcnRpdGlvbiBvZiIsIGRpbShjZXRhY2VhX3BiZGIpWzFdLCAicmVjb3JkZWQgb2NjdXJyZW5jZXMgdGhyb3VnaCB0aW1lIC0gVW5pZm9ybSBkcmF3IikpCgpnZ3Bsb3QoY2V0YWNlYV9wYmRiLCBhZXMoeD0tYWdlX3J1bmlmKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMSkgKwogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIlRpbWUgKE15KSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJOdW1iZXIgb2Ygb2NjdXJyZW5jZXMiKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJBY2NlcHRlZCByYW5rIikgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQucG9zaXRpb249ImJvdHRvbSIpICsKICBnZ3RpdGxlKHBhc3RlKCJFdm9sdXRpb24gb2YgdGhlIG51bWJlciBvY2N1cnJlbmNlcyB0aHJvdWdoIHRpbWUgKCB0b3RhbCBvZiIsIGRpbShjZXRhY2VhX3BiZGIpWzFdLCAiKSAtIFVuaWZvcm0gZHJhdyIpKQpgYGAKCiRcdG8kIFRoZSBkaXN0cmlidXRpb24gc2VlbXMgbXVjaCBzbW9vdGhlciBub3cuCgojIyMgVW5pZm9ybSBzdWJzYW1wbGluZwoKVGhlc2Ugb2NjdXJyZW5jZXMgYXJlIHRvbyBudW1lcm91cyB0byBwZXJmb3JtIGEgcXVpY2sgcHJlbGltaW5hcnkgYW5hbHlzaXMsIHNvIGxldCdzIHJhbmRvbWx5IHN1YnNhbXBsZSBhIGZyYWN0aW9uIG9mIHRoZW0uCgpgYGB7ciwgZmlnLmFzcD0wLjMsIGZpZy53aWR0aD04fQpjZXRhY2VhX3BiZGJfc3Vic2FtcGxlZCA8LSBzYW1wbGVfbihjZXRhY2VhX3BiZGIsIHNpemU9cm91bmQobGVuZ3RoKGFnZV9ydW5pZikqMC4xMCkpCgpnZ3Bsb3QoY2V0YWNlYV9wYmRiX3N1YnNhbXBsZWQsIGFlcyh4PS1hZ2VfcnVuaWYsIHk9cm5vcm0obGVuZ3RoKGFnZV9ydW5pZiksIDEsIDAuMDUpKSkgKwogIGdlb21fcG9pbnQoY2V4PTAuNSwgYWxwaGE9MC41KSArCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiVGltZSAoTXkpIikgKwogIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIk9jY3VycmVuY2VzIiwgbGltaXRzID0gYygwLjcsIDEuMykpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWU9IkFjY2VwdGVkIHJhbmsiKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShzaXplID0gMC41LCBsaW5ldHlwZSA9ICJzb2xpZCIsIGNvbG91ciA9ICJibGFjayIpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGdndGl0bGUocGFzdGUoIlJlcGFydGl0aW9uIG9mIiwgZGltKGNldGFjZWFfcGJkYl9zdWJzYW1wbGVkKVsxXSwgInJlY29yZGVkIG9jY3VycmVuY2VzIHRocm91Z2ggdGltZSAtIFVuaWZvcm0gZHJhdyIpKQoKZ2dwbG90KGNldGFjZWFfcGJkYl9zdWJzYW1wbGVkLCBhZXMoeD0tYWdlX3J1bmlmKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMSkgKwogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIlRpbWUgKE15KSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJOdW1iZXIgb2Ygb2NjdXJyZW5jZXMiKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJBY2NlcHRlZCByYW5rIikgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQucG9zaXRpb249ImJvdHRvbSIpICsKICBnZ3RpdGxlKHBhc3RlKCJFdm9sdXRpb24gb2YgdGhlIG51bWJlciBvY2N1cnJlbmNlcyB0aHJvdWdoIHRpbWUgKCB0b3RhbCBvZiIsIGRpbShjZXRhY2VhX3BiZGJfc3Vic2FtcGxlZClbMV0sICIpIC0gVW5pZm9ybSBkcmF3IikpCmBgYAoKJFx0byQgVGhlIGRpc3RyaWJ1dGlvbiBsb29rcyBzaW1pbGFyLCB3aXRoIHNvbWUgbm9pc2UgZHVlIHRvIGhpZ2hlciB2YXJpYW5jZSB3aXRoIHNtYWxsZXIgc2FtcGxlLgoKYGBge3J9CndyaXRlKGNldGFjZWFfcGJkYiRhZ2VfbWVhbiwgZmlsZSA9ICIuLi9kYXRhLWNldGFjZWFucy9DZXRhY2VhX29jY3VycmVuY2VzX21lYW5fYWdlLmNzdiIsIHNlcD0iOyAiLCBuY29sdW1ucyA9IGRpbShjZXRhY2VhX3BiZGIpWzFdKQp3cml0ZShjZXRhY2VhX3BiZGIkYWdlX3J1bmlmLCBmaWxlID0gIi4uL2RhdGEtY2V0YWNlYW5zL0NldGFjZWFfYWdlX3J1bmlmX2FnZS5jc3YiLCBzZXA9IjsgIiwgbmNvbHVtbnMgPSBkaW0oY2V0YWNlYV9wYmRiKVsxXSkKd3JpdGUoY2V0YWNlYV9wYmRiX3N1YnNhbXBsZWQkYWdlX3J1bmlmLCBmaWxlID0gIi4uL2RhdGEtY2V0YWNlYW5zL0NldGFjZWFfYWdlX3J1bmlmX2FnZV9zdWJzYW1wbGVkLmNzdiIsIHNlcD0iOyAiLCBuY29sdW1ucyA9IGRpbShjZXRhY2VhX3BiZGJfc3Vic2FtcGxlZClbMV0pCmBgYAoKIyMgUmVwYXJ0aXRpb24gYW1vbmcgYWNjZXB0ZWQgcmFua3MKCk9jY3VycmVuY2VzIGFyZSBhc3NvY2lhdGVkIHdpdGggYW4gKiphY2NlcHRlZCByYW5rKiosIGRlcGVuZGluZyBvbiB0aGUgbGV2ZWwgb2YgZGV0YWlsIG9mIHRoZWlyIGRlc2NyaXB0aW9uIGFuZCBhdHRyaWJ1dGlvbiB0byBhIGdpdmVuIHRheG9ub21pYyBwb3NpdGlvbi4KCiMjIyBQaWUgY2hhcnQKCmBgYHtyLCBmaWcud2lkdGg9NX0KZ2dwbG90KGNldGFjZWFfcGJkYiwgYWVzKHg9ZmFjdG9yKHJlY29yZF90eXBlKSwgZmlsbD1hY2NlcHRlZF9yYW5rKSkgKwogIGdlb21fYmFyKHdpZHRoID0gMSwgc3RhdCA9ICJjb3VudCIpICsKICBjb29yZF9wb2xhcigieSIpICsgCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJBY2NlcHRlZCByYW5rIikgKwogIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMLCBmaWxsID0gTlVMTCwgdGl0bGUgPSAiUmVwYXJ0aXRpb24gb2Ygb2NjdXJyZW5jZXMgYW1vbmcgYWNjZXB0ZWQgcmFua3MiKQpgYGAKCiRcdG8kIEhhbGYgb2YgdGhlIG9jY3VycmVuY2VzIGFyZSBpZGVudGlmaWVkIGF0IHRoZSBsZXZlbCBvZiB0aGUgc3BlY2llcyBhbmQgMS8zIGF0IHRoZSBnZW51cyBvciBmYW1pbHkuCgpTb21lIGNsYWRlcyBhcmUgdW5yYW5rZWQ6CgpgYGB7cn0KdGFibGUoYXMuY2hhcmFjdGVyKGNldGFjZWFfcGJkYltjZXRhY2VhX3BiZGIkYWNjZXB0ZWRfcmFuaz09InVucmFua2VkIGNsYWRlIixdJGFjY2VwdGVkX25hbWUpKQpgYGAKCiMjIyBUaW1lIHJlcGFydGl0aW9uIGJ5IHJhbmsKCmBgYHtyLCBmaWcuYXNwPTAuNCwgZmlnLndpZHRoPTEwfQpnZ3Bsb3QoY2V0YWNlYV9wYmRiW2NldGFjZWFfcGJkYiRhY2NlcHRlZF9yYW5rICVpbiUgYygic3BlY2llcyIsICJnZW51cyIpLF0sIGFlcyh4PS1hZ2VfcnVuaWYsIGZpbGw9YWNjZXB0ZWRfcmFuaykpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDAuMSkgKwogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIlRpbWUgKE15KSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJOdW1iZXIgb2Ygb2NjdXJyZW5jZXMiKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJBY2NlcHRlZCByYW5rIikgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGdndGl0bGUoIkV2b2x1dGlvbiBvZiB0aGUgbnVtYmVyIG9jY3VycmVuY2VzIHRocm91Z2ggdGltZSAoMC4xIE15IHRpbWUgYmlucyksIGJ5IGFjY2VwdGVkIHJhbmsiKSArCiAgZmFjZXRfZ3JpZChhY2NlcHRlZF9yYW5rIH4gLiwgc2NhbGVzPSJmcmVlIikKYGBgCgokXHRvJCBBbiBhcHBhcmVudCBodWdlIGNsdXN0ZXIgb2Ygb2NjdXJyZW5jZXMgYXBwZWFycyBpbiByZWNlbnQgdGltZXMsIHdpdGggdmVyeSBwcmVjaXNlIGRhdGluZyA9IEFydGlmYWN0IGR1ZSB0byB0aGUgIlB1bGwgb2YgdGhlIFJlY2VudCIgZWZmZWN0ID8gQm9uZXMgY29sbGVjdGVkIGJ5IGFuY2llbnQgaG9taW5pZHMgPwoKJFxpbXBsaWVzJCBUaGVzZSBvY2N1cnJlbmNlcyBzZWVtIHRvIG9iZXkgdG8gYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBwcm9jZXNzIGFuZCBvdmVyIGEgdmVyeSBzaG9ydCBwZXJpb2Qgb2YgdGltZSwgc28gd2UgZGVjaWRlZCB0byAqKnJlbW92ZSBhbGwgTGF0ZSBQbGVpc3RvY2VuZSBhbmQgSG9sb2NlbmUgb2NjdXJyZW5jZXMqKiBpbiBvcmRlciB0byBhdm9pZCB0aGlzIGJpYXMuCgojIyMgQklBUyBDT1JSRUNUSU9OIE7CsDE6IFJlbW92ZSBhbGwgTGF0ZSBQbGVpc3RvY2VuZSBhbmQgSG9sb2NlbmUgb2NjdXJyZW5jZXMKCmBgYHtyfQpDZXRhY2VhX29jYyA8LSBjZXRhY2VhX3BiZGJbY2V0YWNlYV9wYmRiJGFnZV9ydW5pZiA+IDAuMTI2LF0KCmRhdGEuZnJhbWUoY2V0YWNlYV9wYmRiID0gZGltKGNldGFjZWFfcGJkYilbMV0sCiAgICAgICAgICAgQ2V0YWNlYV9vY2MgPSBkaW0oQ2V0YWNlYV9vY2MpWzFdLAogICAgICAgICAgIHJlbW92ZWQgPSBkaW0oY2V0YWNlYV9wYmRiKVsxXS1kaW0oQ2V0YWNlYV9vY2MpWzFdLAogICAgICAgICAgIHJvdy5uYW1lcyA9ICJOdW1iZXIgb2Ygb2NjdXJyZW5jZXMiKQpgYGAKCmBgYHtyIGZpZy5oZWlnaHQ9Nn0KZ2dwbG90KENldGFjZWFfb2NjWyFDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rICVpbiUgYygic3Vic3BlY2llcyIsICJpbmZyYW9yZGVyIiksXSwgYWVzKHg9LWFnZV9ydW5pZiwgZmlsbD1hY2NlcHRlZF9yYW5rKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMC41KSArCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiVGltZSAoTXkpIikgKwogIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIk51bWJlciBvZiBvY2N1cnJlbmNlcyIpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWU9IkFjY2VwdGVkIHJhbmsiKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpKSArCiAgZ2d0aXRsZSgiRXZvbHV0aW9uIG9mIHRoZSBudW1iZXIgb2NjdXJyZW5jZXMgdGhyb3VnaCB0aW1lICgwLjUgTXkgdGltZSBiaW5zKSwgYnkgYWNjZXB0ZWQgcmFuayIpICsKICBmYWNldF9ncmlkKGFjY2VwdGVkX3JhbmsgfiAuLCBzY2FsZXM9ImZyZWUiKQpgYGAKCiRcdG8kIFRoZSBkaXN0cmlidXRpb25zIGFyZSBtdWNoIG1vcmUgaG9tb2dlbmVvdXMgYWZ0ZXIgdGhlIGNvcnJlY3Rpb24uIFNpbWlsYXIgdHJlbmRzIGNhbiBiZSBvYnNlcnZlZCBhdCBlYWNoIHJhbmssIHdpdGggcGVha3MgYXQgfjE1TXkgYW5kIH41TXkuCgojIyMgUmVkdW5kYW5jeSBvZiBvY2N1cnJlbmNlcyB3aXRoIHRoZSBzYW1lIGFjY2VwdGVkIG5hbWUKCmBgYHtyLCBmaWcuYXNwPTAuNCwgZmlnLndpZHRoPTEwfQpnZ3Bsb3QoY2V0YWNlYV9wYmRiLCBhZXMoeD1yZW9yZGVyKGFjY2VwdGVkX25hbWUsIHRhYmxlKGFjY2VwdGVkX25hbWUpW2FjY2VwdGVkX25hbWVdKSwgZmlsbD1hY2NlcHRlZF9yYW5rKSkgKwogIGdlb21fYmFyKHN0YXQ9ImNvdW50IikgKyAKICBzY2FsZV94X2Rpc2NyZXRlKG5hbWUgPSAiQWNjZXB0ZWQgbmFtZXMiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zID0gImxvZzEwIiwgbmFtZSA9ICJOdW1iZXIgb2YgY29ycmVzcG9uZGluZyBvY2N1cnJlbmNlcyAobG9nLXNjYWxlKSIpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWU9IkFjY2VwdGVkIHJhbmsiKSArCiAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueD1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIGdndGl0bGUoIkRpc3RyaWJ1dGlvbnMgb2YgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyB3aXRoIHRoZSBzYW1lIGFjY2VwdGVkIG5hbWUsIGJ5IGFjY2VwdGVkIHJhbmsiKSArCiAgZmFjZXRfZ3JpZCguIH4gYWNjZXB0ZWRfcmFuaywgc2NhbGVzPSJmcmVlX3giKQpgYGAKCiRcdG8kIH5IYWxmIG9mIHNwZWNpZXMvZ2VuZXJhL3N1YmZhbWlsaWVzIGhhdmUgb25seSBvbmUgc3BlY2ltZW4gYnkgYWNjZXB0ZWQgbmFtZSwgYnV0IGl0IGNvdWxkIGdvIHVwIHRvIH41MCB3aXRoaW4gdGhlIHNhbWUgc3BlY2llcyBhbmQgfjIwMCBvY2N1cnJlbmNlcyB3aXRoaW4gdGhlIHNhbWUgc3Vib3JkZXIuICoqSW4gb3VyIG1vZGVsIGFsbCBzcGVjaWVzIGFyZSB1cHBvc2VkIHRvIGhhdmUgdGhlIHNhbWUgYWJ1bmRhbmNlIChpZGVudGljYWwgc2FtcGxpbmcgcmF0ZXMgYW1vbmcgYnJhbmNoZXMpLCBzbyB0aG9zZSBodWdlIGRpZmZlcmVuY2VzIHdpbGwgaGF2ZSB0byBiZSBtaXRpZ2F0ZWQuKiogU2VlIGxhdGVyIGZvciBhIHF1YW50aWZpY2F0aW9uIG9mIHRoaXMgZGlzY3JlcGFuY3kgYW5kIGEgY29tcGFyaXNvbiB3aXRoIG91ciBtb2RlbCdzIGFzc3VtcHRpb25zCgokXGltcGxpZXMkIE91ciBnb2FsIG5vdyB3aWxsIGJlIHRvIGNvcnJlY3QgdGhpcyBhYnVuZGFuY2UgYmlhcy4KCiMgTWl0aWdhdGUgdGhlIGFidW5kYW5jZSBiaWFzCgpUbyBxdWFudGlmeSBtb3JlIHByZWNpc2VseSB0aGlzIGJpYXMsIHdlIHdpbGw6CgogIDEuIENvdW50IHRoZSAqKm51bWJlciBvZiBvY2N1cnJlbmNlcyoqIGZvciBlYWNoIHRheG9uCiAgMi4gT2J0YWluIHRoZSAqKnN0cmF0aWdyYXBoaWMgcmFuZ2UqKiBvZiBlYWNoIHRheGEgLSBpZS4gdGhlIHRpbWUgaW50ZXJ2YWwgaW4gd2hpY2ggYSB0YXhvbiBpcyBvYnNlcnZlZCAtIGJ5IGNvbWJpbmluZyB0aGUgc3RyYXRpZ3JhcGhpYyBhZ2UgdW5jZXJ0YWludGllcyBvZiBpdHMgb2NjdXJyZW5jZXMKICAzLiBDb21wdXRlIHRoZSAqKmRlbnNpdHkgb2Ygb2NjdXJyZW5jZXMqKiA9IG5iIG9mIG9jY3VycmVuY2VzIC8gc3RyYXRpZ3JhcGhpYyByYW5nZSwgZXhwcmVzc2VkIGluICJudW1iZXIgb2Ygb2NjdXJyZW5jZXMgYnkgbWlsbGlvbiB5ZWFycyIKCiMjIENvbXB1dGUgdGhlIG9jY3VycmVuY2UgZGVuc2l0eQojIyMgQ291bnQgb2NjdXJyZW5jZXMgYnkgYWNjZXB0ZWQgbmFtZQoKQ291bnQgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyB3aXRoIHRoZSBzYW1lIGFjY2VwdGVkIG5hbWUgYW5kIHBsb3QgdGhlaXIgZGlzdHJpYnV0aW9uLgoKYGBge3IgZmlnLmFzcD0wLjUsIGZpZy53aWR0aD0xMH0KIyBDb3VudCB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIHdpdGggdGhlIHNhbWUgYWNjZXB0ZWQgbmFtZQpDZXRhY2VhX29jYyRhY2NlcHRlZF9uYW1lX2NvdW50IDwtIHNhcHBseShDZXRhY2VhX29jYyRhY2NlcHRlZF9uYW1lLCBmdW5jdGlvbih4KXt0YWJsZShDZXRhY2VhX29jYyRhY2NlcHRlZF9uYW1lKVt4XX0pCgpteV9icmVha3MgPC0gYygxLDMsMTAsMzUsMTAwLG1heChDZXRhY2VhX29jYyRhY2NlcHRlZF9uYW1lX2NvdW50KSkKCiMgZ2dwbG90KENldGFjZWFfb2NjWyEoQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuayAlaW4lIGMoInNwZWNpZXMiLCAiZ2VudXMiLCAiZmFtaWx5IikpLF0sIGFlcyh4PS1tYXhfbWEsIHk9YWNjZXB0ZWRfbmFtZSkpICsKIyAgIGdlb21fc2VnbWVudChhZXMoeCA9IC1tYXhfbWEsIHkgPSByZW9yZGVyKGFjY2VwdGVkX25hbWUsIC1hZ2VfbWVhbiksIHhlbmQgPSAtbWluX21hLCB5ZW5kPXJlb3JkZXIoYWNjZXB0ZWRfbmFtZSwgLWFnZV9tZWFuKSwgY29sb3I9YWNjZXB0ZWRfbmFtZV9jb3VudCksIGFycm93PWFycm93KGVuZHMgPSAiYm90aCIsIGFuZ2xlPTkwLCBsZW5ndGggPSB1bml0KDEsICJtbSIpKSwgYWxwaGE9MC41KSArCiMgICBnZW9tX3BvaW50KGFlcyh4PS1hZ2VfcnVuaWYpLCBjb2w9InJlZCIsIGNleD0xLCBhbHBoYT0wLjMpICsKIyAgIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIlRpbWUgKE15KSIpICsKIyAgIHNjYWxlX3lfZGlzY3JldGUobmFtZSA9ICJBY2NlcHRlZCByYW5rcyIpICsKIyAgIGxhYnMoY29sb3VyPSJBY2NlcHRlZCBuYW1lcyBjb3VudCIpICsKIyAgIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSkgKwojICAgc2NhbGVfY29sb3JfZ3JhZGllbnRuKGNvbG91cnMgPSBjKCJkYXJrYmx1ZSIsICJmb3Jlc3RncmVlbiIsICJibGFjayIpLCB0cmFucz0ibG9nIiwgYnJlYWtzPW15X2JyZWFrcywgbGFiZWxzPW15X2JyZWFrcykgKyAKIyAgIGdndGl0bGUoIkRpc3RyaWJ1dGlvbnMgb2YgZm9zc2lsIGFnZSB1bmNlcnRhaW50aWVzLCBieSBhY2NlcHRlZCByYW5rIikgKwojICAgZmFjZXRfZ3JpZChhY2NlcHRlZF9yYW5rIH4gLiwgc2NhbGVzID0gImZyZWUiKQoKZ2dwbG90KENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIsXSwgYWVzKHg9LW1heF9tYSwgeT1hY2NlcHRlZF9uYW1lKSkgKwogIGdlb21fc2VnbWVudChhZXMoeCA9IC1tYXhfbWEsIHkgPSByZW9yZGVyKGFjY2VwdGVkX25hbWUsIC1hZ2VfbWVhbiksIHhlbmQgPSAtbWluX21hLCB5ZW5kPXJlb3JkZXIoYWNjZXB0ZWRfbmFtZSwgLWFnZV9tZWFuKSwgY29sb3I9YWNjZXB0ZWRfbmFtZV9jb3VudCksIGFycm93PWFycm93KGVuZHMgPSAiYm90aCIsIGFuZ2xlPTkwLCBsZW5ndGggPSB1bml0KDEsICJtbSIpKSwgYWxwaGE9MC41KSArCiAgZ2VvbV9wb2ludChhZXMoeD0tYWdlX3J1bmlmKSwgY29sPSJyZWQiLCBjZXg9MSwgYWxwaGE9MC4zKSArCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiVGltZSAoTXkpIikgKwogIHNjYWxlX3lfZGlzY3JldGUobmFtZSA9ICJTcGVjaWVzIikgKwogIGxhYnMoY29sb3VyPSJOYiBvZiBvY2N1cnJlbmNlcyIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9MikpICsKICBzY2FsZV9jb2xvcl9ncmFkaWVudG4oY29sb3VycyA9IGMoImRhcmtibHVlIiwgImZvcmVzdGdyZWVuIiwgImJsYWNrIiksIHRyYW5zPSJsb2ciLCBicmVha3M9bXlfYnJlYWtzLCBsYWJlbHM9bXlfYnJlYWtzKSArIAogIGdndGl0bGUoIkRpc3RyaWJ1dGlvbnMgb2YgZm9zc2lsIGFnZSB1bmNlcnRhaW50aWVzIGZvciBhbGwgc3BlY2llcyIpICsKICBmYWNldF9ncmlkKGFjY2VwdGVkX3JhbmsgfiAuLCBzY2FsZXMgPSAiZnJlZSIpCgpnZ3Bsb3QoQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuayA9PSJnZW51cyIsXSwgYWVzKHg9LW1heF9tYSwgeT1hY2NlcHRlZF9uYW1lKSkgKwogIGdlb21fc2VnbWVudChhZXMoeCA9IC1tYXhfbWEsIHkgPSByZW9yZGVyKGFjY2VwdGVkX25hbWUsIC1hZ2VfbWVhbiksIHhlbmQgPSAtbWluX21hLCB5ZW5kPXJlb3JkZXIoYWNjZXB0ZWRfbmFtZSwgLWFnZV9tZWFuKSwgY29sb3I9YWNjZXB0ZWRfbmFtZV9jb3VudCksIGFycm93PWFycm93KGVuZHMgPSAiYm90aCIsIGFuZ2xlPTkwLCBsZW5ndGggPSB1bml0KDEsICJtbSIpKSwgYWxwaGE9MC41KSArCiAgZ2VvbV9wb2ludChhZXMoeD0tYWdlX3J1bmlmKSwgY29sPSJyZWQiLCBjZXg9MSwgYWxwaGE9MC4zKSArCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiVGltZSAoTXkpIikgKwogIHNjYWxlX3lfZGlzY3JldGUobmFtZSA9ICJHZW51cyIpICsKICBsYWJzKGNvbG91cj0iQWNjZXB0ZWQgbmFtZXMgY291bnQiKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTYpKSArCiAgc2NhbGVfY29sb3JfZ3JhZGllbnRuKGNvbG91cnMgPSBjKCJkYXJrYmx1ZSIsICJmb3Jlc3RncmVlbiIsICJibGFjayIpLCB0cmFucz0ibG9nIiwgYnJlYWtzPW15X2JyZWFrcywgbGFiZWxzPW15X2JyZWFrcykgKwogIGdndGl0bGUoIkRpc3RyaWJ1dGlvbnMgb2YgZm9zc2lsIGFnZSB1bmNlcnRhaW50aWVzIGZvciBhbGwgZ2VuZXJhIikgKwogIGZhY2V0X2dyaWQoYWNjZXB0ZWRfcmFuayB+IC4sIHNjYWxlcyA9ICJmcmVlIikKCiMgZ2dwbG90KENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgPT0iZmFtaWx5IixdLCBhZXMoeD0tbWF4X21hLCB5PWFjY2VwdGVkX25hbWUpKSArCiMgICBnZW9tX3NlZ21lbnQoYWVzKHggPSAtbWF4X21hLCB5ID0gcmVvcmRlcihhY2NlcHRlZF9uYW1lLCAtYWdlX21lYW4pLCB4ZW5kID0gLW1pbl9tYSwgeWVuZD1yZW9yZGVyKGFjY2VwdGVkX25hbWUsIC1hZ2VfbWVhbiksIGNvbG9yPWFjY2VwdGVkX25hbWVfY291bnQpLCBhcnJvdz1hcnJvdyhlbmRzID0gImJvdGgiLCBhbmdsZT05MCwgbGVuZ3RoID0gdW5pdCgxLCAibW0iKSksIGFscGhhPTAuNSkgKwojICAgZ2VvbV9wb2ludChhZXMoeD0tYWdlX3J1bmlmKSwgY29sPSJyZWQiLCBjZXg9MSwgYWxwaGE9MC4zKSArCiMgICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiMgICBzY2FsZV95X2Rpc2NyZXRlKG5hbWUgPSAiR2VudXMiKSArCiMgICBsYWJzKGNvbG91cj0iQWNjZXB0ZWQgbmFtZXMgY291bnQiKSArCiMgICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKIyAgIHNjYWxlX2NvbG9yX2dyYWRpZW50bihjb2xvdXJzID0gYygiZGFya2JsdWUiLCAiZm9yZXN0Z3JlZW4iLCAiYmxhY2siKSwgdHJhbnM9ImxvZyIsIGJyZWFrcz1teV9icmVha3MsIGxhYmVscz1teV9icmVha3MpICsgCiMgICBnZ3RpdGxlKCJEaXN0cmlidXRpb25zIG9mIGZvc3NpbCBhZ2UgdW5jZXJ0YWludGllcyAoZmFtaWxpZXMpIikgKwojICAgZmFjZXRfZ3JpZChhY2NlcHRlZF9yYW5rIH4gLiwgc2NhbGVzID0gImZyZWUiKQpgYGAKCiRcdG8kIFNvbWUgb2NjdXJyZW5jZXMgaGF2ZSB0b28gbXVjaCBhZ2UgdW5jZXJ0YWludHkgKHVucmVsYXRlZCB0byB0YXhvbiBsb25nZXZpdHkgaW4gZXh0cmVtZSBjYXNlcyBsaWtlIHRoZSBvbmUgc3Bhbm5pbmcgNjBNeSksIHRoZXkgcmlzayB0byBhcnRpZmljaWFsbHkgaW5jcmVhc2Ugc3BlY2llcyBkdXJhdGlvbi4KCiMjIyBCSUFTIENPUlJFQ1RJT04gTsKwMjogRXhjbHVkZSBvY2N1cnJlbmNlcyB3aXRoIGhpZ2hseSB1bmNlcnRhaW4gZGF0aW5nICg+IDEwTXkpCgpgYGB7ciwgZmlnLmFzcD0wLjQsIGZpZy53aWR0aD0xMH0KIyBHZXQgdGhlIGR1cmF0aW9uIG9mIHRoZSB1bmNlcnRhaW50eSBpbnRlcnZhbHMKQ2V0YWNlYV9vY2MkYWdlX3VuY2VydGFpbnR5IDwtIENldGFjZWFfb2NjJG1heF9tYS1DZXRhY2VhX29jYyRtaW5fbWEKCmdncGxvdChDZXRhY2VhX29jYywgYWVzKHg9YWdlX3VuY2VydGFpbnR5LCBmaWxsPWFjY2VwdGVkX3JhbmspKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxKSArCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiQWdlIHVuY2VydGFpbnR5IChNeSkiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiTnVtYmVyIG9mIGNvcnJlc3BvbmRpbmcgb2NjdXJyZW5jZXMiKSArCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gOS41LCB5ID0gMCwgeGVuZCA9IDkuNSwgeWVuZD0xMDUwKSwgY29sb3I9ImJsYWNrIiwgbGluZXR5cGU9ImRhc2hlZCIpICsKICBnZ3RpdGxlKCJEaXN0cmlidXRpb24gb2Ygb2NjdXJyZW5jZXMnIGFnZSB1bmNlcnRhaW50eSBhbmQgcmVtb3ZhbCBsaW1pdCAoZGFzaGVkIGxpbmUpIikKYGBgCgpNb3N0IG9mIG9jY3VycmVuY2VzIHNob3cgbGVzcyB0aGFuIDEwIE15IGFnZSB1bmNlcnRhaW50eSwgbGV0J3Mga2VlcCBvbmx5IHRoZXNlIG9uZXMuCgpgYGB7cn0KZGF0YS5mcmFtZShhbGxfcmFuZ2VzID0gZGltKENldGFjZWFfb2NjKVsxXSwKICAgICAgICAgICBzbWFsbGVyXzEwTXkgPSBkaW0oQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWdlX3VuY2VydGFpbnR5PDEwLF0pWzFdLAogICAgICAgICAgIHJlbW92ZWQgPSBkaW0oQ2V0YWNlYV9vY2MpWzFdLWRpbShDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhZ2VfdW5jZXJ0YWludHk8MTAsXSlbMV0sIHJvdy5uYW1lcyA9ICJOdW1iZXIgb2Ygb2NjdXJyZW5jZXMiKQpgYGAKCmBgYHtyIGZpZy5oZWlnaHQ9Nn0KIyBnZ3Bsb3QoQ2V0YWNlYV9vY2MsIGFlcyh4PWFnZV9ydW5pZiwgeT1hZ2VfdW5jZXJ0YWludHkpKSArCiMgICBnZW9tX3BvaW50KGFscGhhPTAuMDUpICsKIyAgIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIlVuaWZvcm1seSBkcmF3biBhZ2UgKE15KSIpICsKIyAgIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIkFnZSB1bmNlcnRhaW50eSAoTXkpIikgKwojICAgZ2d0aXRsZSgiRGlzdHJpYnV0aW9uIG9mIG9jY3VycmVuY2VzJyBhZ2UgdW5jZXJ0YWludHkiKQoKZ2dwbG90KENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFnZV91bmNlcnRhaW50eSAhPSA2My40MTIsXSwgYWVzKHg9YWdlX3J1bmlmLCB5PWFnZV91bmNlcnRhaW50eSkpICsKICBnZW9tX3BvaW50KGFscGhhPTAuMDUpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJVbmlmb3JtbHkgZHJhd24gYWdlIChNeSkiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiQWdlIHVuY2VydGFpbnR5IChNeSkiKSArCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gMCwgeSA9IDEwLCB4ZW5kPTYwLCB5ZW5kID0gMTApLCBjb2xvcj0iYmxhY2siLCBsaW5ldHlwZT0iZGFzaGVkIikgKwogIGdndGl0bGUoIkRpc3RyaWJ1dGlvbiBvZiBvY2N1cnJlbmNlcycgYWdlIHVuY2VydGFpbnR5IGFuZCByZW1vdmFsIGxpbWl0IChkYXNoZWQgbGluZSkiKQoKIyBnZ3Bsb3QoQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWdlX3VuY2VydGFpbnR5PDEwLF0sIGFlcyh4PWFnZV9ydW5pZiwgeT1hZ2VfdW5jZXJ0YWludHkpKSArCiMgICBnZW9tX3BvaW50KGFscGhhPTAuMDUpICsKIyAgIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIlVuaWZvcm1seSBkcmF3biBhZ2UgKE15KSIpICsKIyAgIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIkFnZSB1bmNlcnRhaW50eSAoTXkpIikgKwojICAgZ2d0aXRsZSgiRGlzdHJpYnV0aW9uIG9mIG9jY3VycmVuY2VzJyBhZ2UgdW5jZXJ0YWludHkiKQoKaGlzdCgtQ2V0YWNlYV9vY2MkYWdlX3J1bmlmLCBicmVha3MgPSA1MCwgY29sPSJyZWQiLCBwcm9iYWJpbGl0eT1ULCBtYWluPSJEaXN0cmlidXRpb24gb2Ygb2NjdXJyZW5jZXMsIHdpdGggKHJlZCkgb2Ygd2l0aG91dCAoYmx1ZSkgcmVjZW50IHNhbXBsZXMiLCB4bGFiID0gIlRpbWUgKE15KSIsIHlsYWIgPSAiUHJvcG9ydGlvbiBvZiBvY2N1cnJlbmNlcyIpCmhpc3QoLUNldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFnZV91bmNlcnRhaW50eTwxMCxdJGFnZV9ydW5pZiwgYnJlYWtzID0gNTAsIGNvbD0iYmx1ZSIsIHByb2JhYmlsaXR5PVQsIGRlbnNpdHk9VCwgYWRkPVQpCmBgYAoKJFx0byQgVGhlIHJlbW92YWwgb2YgaGlnaGx5IHVuY2VydGFpbiBvY2N1cnJlbmNlcyBzZWVtcyB0byBiZSBvbmx5IGEgbGl0dGxlIGJpYXNlZCwgZXZlbiBpZiB1bmNlcnRhaW50eSBnbG9iYWxseSBpbmNyZWFzZXMgd2l0aCBhZ2UuCgpgYGB7ciwgZmlnLmFzcD0wLjUsIGZpZy53aWR0aD0xMH0KbXlfYnJlYWtzIDwtIGMoMSwzLDEwLDM1LDEwMCxtYXgoQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfbmFtZV9jb3VudCkpCgojIGdncGxvdChDZXRhY2VhX29jY1shKENldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgJWluJSBjKCJzcGVjaWVzIiwgImdlbnVzIiwgImZhbWlseSIpKSAmIENldGFjZWFfb2NjJGFnZV91bmNlcnRhaW50eTwxMCxdLCBhZXMoeD0tbWF4X21hLCB5PWFjY2VwdGVkX25hbWUpKSArCiMgICBnZW9tX3NlZ21lbnQoYWVzKHggPSAtbWF4X21hLCB5ID0gcmVvcmRlcihhY2NlcHRlZF9uYW1lLCAtYWdlX21lYW4pLCB4ZW5kID0gLW1pbl9tYSwgeWVuZD1yZW9yZGVyKGFjY2VwdGVkX25hbWUsIC1hZ2VfbWVhbiksIGNvbG9yPWFjY2VwdGVkX25hbWVfY291bnQpLCBhcnJvdz1hcnJvdyhlbmRzID0gImJvdGgiLCBhbmdsZT05MCwgbGVuZ3RoID0gdW5pdCgxLCAibW0iKSksIGFscGhhPTAuNSkgKwojICAgZ2VvbV9wb2ludChhZXMoeD0tYWdlX3J1bmlmKSwgY29sPSJyZWQiLCBjZXg9MSwgYWxwaGE9MC41KSArCiMgICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiMgICBzY2FsZV95X2Rpc2NyZXRlKG5hbWUgPSAiQWNjZXB0ZWQgcmFua3MiKSArCiMgICBsYWJzKGNvbG91cj0iQWNjZXB0ZWQgbmFtZXMgY291bnQiKSArCiMgICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKIyAgIHNjYWxlX2NvbG9yX2dyYWRpZW50bihjb2xvdXJzID0gYygiZGFya2JsdWUiLCAiZm9yZXN0Z3JlZW4iLCAiYmxhY2siKSwgdHJhbnM9ImxvZyIsIGJyZWFrcz1teV9icmVha3MsIGxhYmVscz1teV9icmVha3MpICsgCiMgICBnZ3RpdGxlKCJEaXN0cmlidXRpb25zIG9mIGZvc3NpbCBhZ2UgdW5jZXJ0YWludGllcywgYnkgYWNjZXB0ZWQgcmFuayIpICsKIyAgIGZhY2V0X2dyaWQoYWNjZXB0ZWRfcmFuayB+IC4sIHNjYWxlcyA9ICJmcmVlIikKCmdncGxvdChDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rID09InNwZWNpZXMiICYgQ2V0YWNlYV9vY2MkYWdlX3VuY2VydGFpbnR5PDEwLF0sIGFlcyh4PS1tYXhfbWEsIHk9YWNjZXB0ZWRfbmFtZSkpICsKICBnZW9tX3NlZ21lbnQoYWVzKHggPSAtbWF4X21hLCB5ID0gcmVvcmRlcihhY2NlcHRlZF9uYW1lLCAtYWdlX21lYW4pLCB4ZW5kID0gLW1pbl9tYSwgeWVuZD1yZW9yZGVyKGFjY2VwdGVkX25hbWUsIC1hZ2VfbWVhbiksIGNvbG9yPWFjY2VwdGVkX25hbWVfY291bnQpLCBhcnJvdz1hcnJvdyhlbmRzID0gImJvdGgiLCBhbmdsZT05MCwgbGVuZ3RoID0gdW5pdCgxLCAibW0iKSksIGFscGhhPTAuNSkgKwogIGdlb21fcG9pbnQoYWVzKHg9LWFnZV9ydW5pZiksIGNvbD0icmVkIiwgY2V4PTEsIGFscGhhPTAuNSkgKwogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIlRpbWUgKE15KSIpICsKICBzY2FsZV95X2Rpc2NyZXRlKG5hbWUgPSAiQWdlIHVuY2VydGFpbnRpZXMiKSArCiAgbGFicyhjb2xvdXI9IkFjY2VwdGVkIG5hbWVzIGNvdW50IikgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT0yKSkgKwogIHNjYWxlX2NvbG9yX2dyYWRpZW50bihjb2xvdXJzID0gYygiZGFya2JsdWUiLCAiZm9yZXN0Z3JlZW4iLCAiYmxhY2siKSwgdHJhbnM9ImxvZyIsIGJyZWFrcz1teV9icmVha3MsIGxhYmVscz1teV9icmVha3MpICsgCiAgZ2d0aXRsZSgiRGlzdHJpYnV0aW9ucyBvZiBmb3NzaWwgYWdlIHVuY2VydGFpbnRpZXMgKHNwZWNpZXMpIikgKwogIGZhY2V0X2dyaWQoYWNjZXB0ZWRfcmFuayB+IC4sIHNjYWxlcyA9ICJmcmVlIikKCmdncGxvdChDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rID09ImdlbnVzIiAmIENldGFjZWFfb2NjJGFnZV91bmNlcnRhaW50eTwxMCxdLCBhZXMoeD0tbWF4X21hLCB5PWFjY2VwdGVkX25hbWUpKSArCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gLW1heF9tYSwgeSA9IHJlb3JkZXIoYWNjZXB0ZWRfbmFtZSwgLWFnZV9tZWFuKSwgeGVuZCA9IC1taW5fbWEsIHllbmQ9cmVvcmRlcihhY2NlcHRlZF9uYW1lLCAtYWdlX21lYW4pLCBjb2xvcj1hY2NlcHRlZF9uYW1lX2NvdW50KSwgYXJyb3c9YXJyb3coZW5kcyA9ICJib3RoIiwgYW5nbGU9OTAsIGxlbmd0aCA9IHVuaXQoMSwgIm1tIikpLCBhbHBoYT0wLjUpICsKICBnZW9tX3BvaW50KGFlcyh4PS1hZ2VfcnVuaWYpLCBjb2w9InJlZCIsIGNleD0xLCBhbHBoYT0wLjUpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiAgc2NhbGVfeV9kaXNjcmV0ZShuYW1lID0gIkdlbnVzIikgKwogIGxhYnMoY29sb3VyPSJBY2NlcHRlZCBuYW1lcyBjb3VudCIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9NikpICsKICBzY2FsZV9jb2xvcl9ncmFkaWVudG4oY29sb3VycyA9IGMoImRhcmtibHVlIiwgImZvcmVzdGdyZWVuIiwgImJsYWNrIiksIHRyYW5zPSJsb2ciLCBicmVha3M9bXlfYnJlYWtzLCBsYWJlbHM9bXlfYnJlYWtzKSArIAogIGdndGl0bGUoIkRpc3RyaWJ1dGlvbnMgb2YgZm9zc2lsIGFnZSB1bmNlcnRhaW50aWVzIChnZW5lcmEpIikgKwogIGZhY2V0X2dyaWQoYWNjZXB0ZWRfcmFuayB+IC4sIHNjYWxlcyA9ICJmcmVlIikKCiMgZ2dwbG90KENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgPT0iZmFtaWx5IiAmIENldGFjZWFfb2NjJGFnZV91bmNlcnRhaW50eTwxMCxdLCBhZXMoeD0tbWF4X21hLCB5PWFjY2VwdGVkX25hbWUpKSArCiMgICBnZW9tX3NlZ21lbnQoYWVzKHggPSAtbWF4X21hLCB5ID0gcmVvcmRlcihhY2NlcHRlZF9uYW1lLCAtYWdlX21lYW4pLCB4ZW5kID0gLW1pbl9tYSwgeWVuZD1yZW9yZGVyKGFjY2VwdGVkX25hbWUsIC1hZ2VfbWVhbiksIGNvbG9yPWFjY2VwdGVkX25hbWVfY291bnQpLCBhcnJvdz1hcnJvdyhlbmRzID0gImJvdGgiLCBhbmdsZT05MCwgbGVuZ3RoID0gdW5pdCgxLCAibW0iKSksIGFscGhhPTAuNSkgKwojICAgZ2VvbV9wb2ludChhZXMoeD0tYWdlX3J1bmlmKSwgY29sPSJyZWQiLCBjZXg9MSwgYWxwaGE9MC41KSArCiMgICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiMgICBzY2FsZV95X2Rpc2NyZXRlKG5hbWUgPSAiR2VudXMiKSArCiMgICBsYWJzKGNvbG91cj0iQWNjZXB0ZWQgbmFtZXMgY291bnQiKSArCiMgICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKIyAgIHNjYWxlX2NvbG9yX2dyYWRpZW50bihjb2xvdXJzID0gYygiZGFya2JsdWUiLCAiZm9yZXN0Z3JlZW4iLCAiYmxhY2siKSwgdHJhbnM9ImxvZyIsIGJyZWFrcz1teV9icmVha3MsIGxhYmVscz1teV9icmVha3MpICsgCiMgICBnZ3RpdGxlKCJEaXN0cmlidXRpb25zIG9mIGZvc3NpbCBhZ2UgdW5jZXJ0YWludGllcyAoZmFtaWxpZXMpIikgKwojICAgZmFjZXRfZ3JpZChhY2NlcHRlZF9yYW5rIH4gLiwgc2NhbGVzID0gImZyZWUiKQpgYGAKCiRcdG8kIFNvbWUgdGF4YSBoYXZlIHNldmVyYWwgb2NjdXJyZW5jZXMgd2l0aCBkaXN0aW5jdCBhZ2UgdW5jZXJ0YWludHkgaW50ZXJ2YWxzLCAqKmxldCdzIGNvbWJpbmUgdGhlbSBpbnRvIGEgdW5pcXVlIHN0cmF0aWdyYXBoaWMgcmFuZ2UqKi4KCiMjIyBTdHJhdGlncmFwaGljIHJhbmdlcyA9IHVuaXF1ZSB0aW1lIGludGVydmFsIGNvbWJpbmluZyBhZ2UgdW5jZXJ0YWludGllcyBvZiBvY2N1cnJlbmNlcyBvZiB0aGUgc2FtZSB0YXhvbiAoZXhjbHVkaW5nIHRoZSBtb3N0IHVuY2VydGFpbiBvbmVzKQoKYGBge3IsIGZpZy5hc3A9MC41LCBmaWcud2lkdGg9MTAsIHdhcm5pbmc9RkFMU0V9CiMgR2V0IHRoZSBtaW5pbXVuIG9mIHRoZSBtaW5pbWFsIGFnZXMgZm9yIGVhY2ggYWNjZXB0ZWQgbmFtZQpDZXRhY2VhX29jYyRtaW5fbWluX21hIDwtIGFwcGx5KENldGFjZWFfb2NjLCAxLCBmdW5jdGlvbihYKXttaW4oQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfbmFtZT09WFsiYWNjZXB0ZWRfbmFtZSJdICYgQ2V0YWNlYV9vY2MkYWdlX3VuY2VydGFpbnR5PDEwLF0kbWluX21hKX0pCiMgR2V0IHRoZSBtYXhpbXVtIG9mIHRoZSBtYXhpbWFsIGFnZXMgZm9yIGVhY2ggYWNjZXB0ZWQgbmFtZQpDZXRhY2VhX29jYyRtYXhfbWF4X21hIDwtIGFwcGx5KENldGFjZWFfb2NjLCAxLCBmdW5jdGlvbihYKXttYXgoQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfbmFtZT09WFsiYWNjZXB0ZWRfbmFtZSJdICYgQ2V0YWNlYV9vY2MkYWdlX3VuY2VydGFpbnR5PDEwLF0kbWF4X21hKX0pCiMgR2V0IHRoZSBzdHJhdGlncmFwaGljIHJhbmdlCkNldGFjZWFfb2NjJHN0cmF0aWdyYXBoaWNfcmFuZ2UgPC0gbWFwcGx5KGZ1bmN0aW9uKG1pbl9taW5fYWdlLCBtYXhfbWF4X2FnZSl7cGFzdGUoIlsiLC1tYXhfbWF4X2FnZSwiLCAiLC1taW5fbWluX2FnZSwiXSIsIHNlcCA9ICIiKX0sIENldGFjZWFfb2NjJG1pbl9taW5fbWEsIENldGFjZWFfb2NjJG1heF9tYXhfbWEpCiMgR2V0IHRoZSBzdHJhdGlncmFwaGljIHJhbmdlIG1pZHBvaW50CkNldGFjZWFfb2NjJHN0cmF0aWdyYXBoaWNfcmFuZ2VfbWlkcG9pbnQgPC0gKENldGFjZWFfb2NjJG1pbl9taW5fbWEgKyBDZXRhY2VhX29jYyRtYXhfbWF4X21hKS8yCiMgR2V0IHRoZSBkdXJhdGlvbiBvZiB0aGUgY29tYmluZWQgdGltZSBpbnRlcnZhbHMKQ2V0YWNlYV9vY2Mkc3RyYXRpZ3JhcGhpY19yYW5nZV9kdXJhdGlvbiA8LSBDZXRhY2VhX29jYyRtYXhfbWF4X21hLUNldGFjZWFfb2NjJG1pbl9taW5fbWEKCiMgZ2dwbG90KENldGFjZWFfb2NjWyEoQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuayAlaW4lIGMoInNwZWNpZXMiLCAiZ2VudXMiLCAiZmFtaWx5IikpICYgQ2V0YWNlYV9vY2MkYWdlX3VuY2VydGFpbnR5PDEwLF0sIGFlcyh4PS1tYXhfbWEsIHk9YWNjZXB0ZWRfbmFtZSkpICsKIyAgIGdlb21fc2VnbWVudChhZXMoeCA9IC1tYXhfbWF4X21hLCB5ID0gcmVvcmRlcihhY2NlcHRlZF9uYW1lLCAtc3RyYXRpZ3JhcGhpY19yYW5nZV9taWRwb2ludCksIHhlbmQgPSAtbWluX21pbl9tYSwgeWVuZD1yZW9yZGVyKGFjY2VwdGVkX25hbWUsIC1zdHJhdGlncmFwaGljX3JhbmdlX21pZHBvaW50KSwgY29sb3I9YWNjZXB0ZWRfbmFtZV9jb3VudCksIGFycm93PWFycm93KGVuZHMgPSAiYm90aCIsIGFuZ2xlPTkwLCBsZW5ndGggPSB1bml0KDEsICJtbSIpKSwgYWxwaGE9MC41KSArCiMgICBnZW9tX3BvaW50KGFlcyh4PS1hZ2VfcnVuaWYpLCBjb2w9InJlZCIsIGNleD0xLCBhbHBoYT0wLjUpICsKIyAgIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIlRpbWUgKE15KSIpICsKIyAgIHNjYWxlX3lfZGlzY3JldGUobmFtZSA9ICJBY2NlcHRlZCByYW5rcyIpICsKIyAgIGxhYnMoY29sb3VyPSJBY2NlcHRlZCBuYW1lcyBjb3VudCIpICsKIyAgIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSkgKwojICAgc2NhbGVfY29sb3JfZ3JhZGllbnRuKGNvbG91cnMgPSBjKCJkYXJrYmx1ZSIsICJmb3Jlc3RncmVlbiIsICJibGFjayIpLCB0cmFucz0ibG9nIiwgYnJlYWtzPW15X2JyZWFrcywgbGFiZWxzPW15X2JyZWFrcykgKyAKIyAgIGdndGl0bGUoIkRpc3RyaWJ1dGlvbnMgb2YgZm9zc2lsIGNvbWJpbmVkIGFnZSB1bmNlcnRhaW50aWVzLCBieSBhY2NlcHRlZCByYW5rIikgKwojICAgZmFjZXRfZ3JpZChhY2NlcHRlZF9yYW5rIH4gLiwgc2NhbGVzID0gImZyZWUiKQoKZ2dwbG90KENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIgJiBDZXRhY2VhX29jYyRhZ2VfdW5jZXJ0YWludHk8MTAsXSwgYWVzKHg9LW1heF9tYSwgeT1hY2NlcHRlZF9uYW1lKSkgKwogIGdlb21fc2VnbWVudChhZXMoeCA9IC1tYXhfbWF4X21hLCB5ID0gcmVvcmRlcihhY2NlcHRlZF9uYW1lLCAtc3RyYXRpZ3JhcGhpY19yYW5nZV9taWRwb2ludCksIHhlbmQgPSAtbWluX21pbl9tYSwgeWVuZD1yZW9yZGVyKGFjY2VwdGVkX25hbWUsIC1zdHJhdGlncmFwaGljX3JhbmdlX21pZHBvaW50KSwgY29sb3I9YWNjZXB0ZWRfbmFtZV9jb3VudCksIGFycm93PWFycm93KGVuZHMgPSAiYm90aCIsIGFuZ2xlPTkwLCBsZW5ndGggPSB1bml0KDEsICJtbSIpKSwgYWxwaGE9MC41KSArCiAgZ2VvbV9wb2ludChhZXMoeD0tYWdlX3J1bmlmKSwgY29sPSJyZWQiLCBjZXg9MSwgYWxwaGE9MC41KSArCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiVGltZSAoTXkpIikgKwogIHNjYWxlX3lfZGlzY3JldGUobmFtZSA9ICJBZ2UgdW5jZXJ0YWludGllcyIpICsKICBsYWJzKGNvbG91cj0iQWNjZXB0ZWQgbmFtZXMgY291bnQiKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTIpKSArCiAgc2NhbGVfY29sb3JfZ3JhZGllbnRuKGNvbG91cnMgPSBjKCJkYXJrYmx1ZSIsICJmb3Jlc3RncmVlbiIsICJibGFjayIpLCB0cmFucz0ibG9nIiwgYnJlYWtzPW15X2JyZWFrcywgbGFiZWxzPW15X2JyZWFrcykgKyAKICBnZ3RpdGxlKCJEaXN0cmlidXRpb25zIG9mIGZvc3NpbCBjb21iaW5lZCBhZ2UgdW5jZXJ0YWludGllcyAoc3BlY2llcykiKSArCiAgZmFjZXRfZ3JpZChhY2NlcHRlZF9yYW5rIH4gLiwgc2NhbGVzID0gImZyZWUiKQoKZ2dwbG90KENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgPT0iZ2VudXMiICYgQ2V0YWNlYV9vY2MkYWdlX3VuY2VydGFpbnR5PDEwLF0sIGFlcyh4PS1tYXhfbWEsIHk9YWNjZXB0ZWRfbmFtZSkpICsKICBnZW9tX3NlZ21lbnQoYWVzKHggPSAtbWF4X21heF9tYSwgeSA9IHJlb3JkZXIoYWNjZXB0ZWRfbmFtZSwgLXN0cmF0aWdyYXBoaWNfcmFuZ2VfbWlkcG9pbnQpLCB4ZW5kID0gLW1pbl9taW5fbWEsIHllbmQ9cmVvcmRlcihhY2NlcHRlZF9uYW1lLCAtc3RyYXRpZ3JhcGhpY19yYW5nZV9taWRwb2ludCksIGNvbG9yPWFjY2VwdGVkX25hbWVfY291bnQpLCBhcnJvdz1hcnJvdyhlbmRzID0gImJvdGgiLCBhbmdsZT05MCwgbGVuZ3RoID0gdW5pdCgxLCAibW0iKSksIGFscGhhPTAuNSkgKwogIGdlb21fcG9pbnQoYWVzKHg9LWFnZV9ydW5pZiksIGNvbD0icmVkIiwgY2V4PTEsIGFscGhhPTAuNSkgKwogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIlRpbWUgKE15KSIpICsKICBzY2FsZV95X2Rpc2NyZXRlKG5hbWUgPSAiR2VuZXJhIikgKwogIGxhYnMoY29sb3VyPSJBY2NlcHRlZCBuYW1lcyBjb3VudCIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9NikpICsKICBzY2FsZV9jb2xvcl9ncmFkaWVudG4oY29sb3VycyA9IGMoImRhcmtibHVlIiwgImZvcmVzdGdyZWVuIiwgImJsYWNrIiksIHRyYW5zPSJsb2ciLCBicmVha3M9bXlfYnJlYWtzLCBsYWJlbHM9bXlfYnJlYWtzKSArIAogIGdndGl0bGUoIkRpc3RyaWJ1dGlvbnMgb2YgZm9zc2lsIGNvbWJpbmVkIGFnZSB1bmNlcnRhaW50aWVzIChnZW5lcmEpIikgKwogIGZhY2V0X2dyaWQoYWNjZXB0ZWRfcmFuayB+IC4sIHNjYWxlcyA9ICJmcmVlIikKCiMgZ2dwbG90KENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgPT0iZmFtaWx5IiAmIENldGFjZWFfb2NjJGFnZV91bmNlcnRhaW50eTwxMCxdLCBhZXMoeD0tbWF4X21hLCB5PWFjY2VwdGVkX25hbWUpKSArCiMgICBnZW9tX3NlZ21lbnQoYWVzKHggPSAtbWF4X21heF9tYSwgeSA9IHJlb3JkZXIoYWNjZXB0ZWRfbmFtZSwgLXN0cmF0aWdyYXBoaWNfcmFuZ2VfbWlkcG9pbnQpLCB4ZW5kID0gLW1pbl9taW5fbWEsIHllbmQ9cmVvcmRlcihhY2NlcHRlZF9uYW1lLCAtc3RyYXRpZ3JhcGhpY19yYW5nZV9taWRwb2ludCksIGNvbG9yPWFjY2VwdGVkX25hbWVfY291bnQpLCBhcnJvdz1hcnJvdyhlbmRzID0gImJvdGgiLCBhbmdsZT05MCwgbGVuZ3RoID0gdW5pdCgxLCAibW0iKSksIGFscGhhPTAuNSkgKwojICAgZ2VvbV9wb2ludChhZXMoeD0tYWdlX3J1bmlmKSwgY29sPSJyZWQiLCBjZXg9MSwgYWxwaGE9MC41KSArCiMgICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiMgICBzY2FsZV95X2Rpc2NyZXRlKG5hbWUgPSAiRmFtaWxpZXMiKSArCiMgICBsYWJzKGNvbG91cj0iQWNjZXB0ZWQgbmFtZXMgY291bnQiKSArCiMgICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKIyAgIHNjYWxlX2NvbG9yX2dyYWRpZW50bihjb2xvdXJzID0gYygiZGFya2JsdWUiLCAiZm9yZXN0Z3JlZW4iLCAiYmxhY2siKSwgdHJhbnM9ImxvZyIsIGJyZWFrcz1teV9icmVha3MsIGxhYmVscz1teV9icmVha3MpICsgCiMgICBnZ3RpdGxlKCJEaXN0cmlidXRpb25zIG9mIGZvc3NpbCBjb21iaW5lZCBhZ2UgdW5jZXJ0YWludGllcyAoZmFtaWxpZXMpIikgKwojICAgZmFjZXRfZ3JpZChhY2NlcHRlZF9yYW5rIH4gLiwgc2NhbGVzID0gImZyZWUiKQpgYGAKCiMjIyBEZW5zaXR5IGRpc3RyaWJ1dGlvbnMKClBsb3QgdGhlIGRlbnNpdHkgb2Ygb2NjdXJyZW5jZXMgKD0gbnVtYmVyIG9mIG9jY3VycmVuY2VzIGJ5IHVuaXQgb2YgdGltZSwgaW4gdGhlIHN0cmF0aWdyYXBoaWMgaW50ZXJ2YWwgb2YgYSB0YXhvbikgZm9yIGVhY2ggdGF4b25vbWljIHJhbmsuCgpgYGB7ciwgZmlnLmFzcD0wLjUsIGZpZy53aWR0aD0xMX0KIyBHZXQgdGhlIGRlbnNpdHkgb2Ygb2NjdXJyZW5jZXMgaW4gdGhlIGludGVydmFscwpDZXRhY2VhX29jYyRvY2N1cnJlbmNlX2RlbnNpdHkgPC0gQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfbmFtZV9jb3VudC9DZXRhY2VhX29jYyRhZ2VfdW5jZXJ0YWludHkKCmdncGxvdChDZXRhY2VhX29jY1shKENldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgJWluJSBjKCJzdWJzcGVjaWVzIiwgImluZnJhb3JkZXIiKSkgJiBDZXRhY2VhX29jYyRhZ2VfdW5jZXJ0YWludHk8MTAsXSwgYWVzKHg9b2NjdXJyZW5jZV9kZW5zaXR5KSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoPTAuMSkgKwogIHNjYWxlX3hfY29udGludW91cyh0cmFucz0ibG9nMTAiLCBuYW1lPSJEZW5zaXR5IG9mIG9jY3VycmVuY2VzIChudW1iZXIvTXkpIikgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGdndGl0bGUoIkRpc3RyaWJ1dGlvbnMgb2NjdXJyZW5jZSBkZW5zaXR5LCBieSBhY2NlcHRlZCByYW5rIikgKwogIGZhY2V0X2dyaWQoYWNjZXB0ZWRfcmFuayB+IC4sIHNjYWxlcyA9ICJmcmVlIikKYGBgCgokXHRvJCBEZW5zaXR5IGxvZ2ljYWxseSBpbmNyZWFzZXMgd2l0aCB0YXhhIHJhbmtzLCBidXQgdGhlIGRpc3RyaWJ1dGlvbnMgZm9yIHNwZWNpZXMgYW5kIGdlbmVyYSBkcmFtYXRpY2FsbHkgc3ByZWFkIG92ZXIgdHdvIG9yZGVycyBvZiBtYWduaXR1ZGUuCgojIyMgQ29ycmVsYXRpb24gYmV0d2VlbiBvY2N1cnJlbmNlIGRlbnNpdHkgYW5kIGFnZQoKSWYgd2Ugd2FudCB0byBjb3JyZWN0IHNwZWNpZXMgYWJ1bmRhbmNlIGRpZmZlcmVuY2VzIGJhc2VkIG9uIHRoZSBkZW5zaXR5IG9mIG9jY3VycmVuY2VzIGluIHRoZSBhZ2UgaW50ZXJ2YWwsIHRob3NlIGZhY3RvcnMgc2hvdWxkIG5vdCBkZXBlbmQgb24gdGltZSBpbiBvcmRlciB0byBhdm9pZCBwZW5hbGl6aW5nIHBlcmlvZHMgd2l0aCBoaWdoZXIgZGVuc2l0aWVzLgoKTGV0J3MgY29tcGFyZSB0aGUgb2NjdXJyZW5jZSBkZW5zaXRpZXMgY29tcHV0ZWQgd2l0aCB0aGUgaW5pdGlhbCB0aW1lIHJhbmdlcyBhbmQgdGhlICpjb21iaW5lZCBkZW5zaXRpZXMqIGNvbXB1dGVkIHdpdGggdGhlIGNvbWJpbmVkIHN0cmF0aWdyYXBoaWMgcmFuZ2VzLgoKYGBge3J9CmNvbmRpdGlvbnMgPC0gQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuayA9PSJzcGVjaWVzIiAmIENldGFjZWFfb2NjJGFnZV91bmNlcnRhaW50eTwxMAoKIyBHZXQgdGhlIHN0cmF0aWdyYXBoaWMgYWdlIHVuY2VydGFpbnR5IGludGVydmFsCkNldGFjZWFfb2NjJGFnZV91bmNlcnRhaW50eV9pbnRlcnZhbCA8LSBtYXBwbHkoZnVuY3Rpb24obWluX2FnZSwgbWF4X2FnZSl7cGFzdGUoIlsiLC1tYXhfYWdlLCIsICIsLW1pbl9hZ2UsIl0iLCBzZXAgPSAiIil9LCBDZXRhY2VhX29jYyRtaW5fbWEsIENldGFjZWFfb2NjJG1heF9tYSkKCiMgRnVuY3Rpb24gdG8gcGxvdCBsaW5lYXIgcmVncmVzc2lvbiBjb2VmZmljaWVudHMKbG1fZXFuIDwtIGZ1bmN0aW9uKGRmKXsKICAgIG0gPC0gbG0oeSB+IHgsIGRmKTsKICAgIGVxIDwtIHN1YnN0aXR1dGUoaXRhbGljKHkpID09IGEgKyBiICUuJSBpdGFsaWMoeCkqIiwifn5pdGFsaWMocileMn4iPSJ+cjIsIAogICAgICAgICBsaXN0KGEgPSBmb3JtYXQodW5uYW1lKGNvZWYobSlbMV0pLCBkaWdpdHMgPSAyKSwKICAgICAgICAgICAgICBiID0gZm9ybWF0KHVubmFtZShjb2VmKG0pWzJdKSwgZGlnaXRzID0gMiksCiAgICAgICAgICAgICByMiA9IGZvcm1hdChzdW1tYXJ5KG0pJHIuc3F1YXJlZCwgZGlnaXRzID0gMykpKQogICAgYXMuY2hhcmFjdGVyKGFzLmV4cHJlc3Npb24oZXEpKTsKfQoKIyBLZWVwIG9ubHkgb25lIHBvaW50IGJ5IGlkZW50aWNhbCB0aW1lIGludGVydmFsCmFnZV91bmNlcnRhaW50eV9pbnRlcnZhbF90YWJsZSA8LSB0YWJsZShDZXRhY2VhX29jY1tjb25kaXRpb25zLF0kYWdlX3VuY2VydGFpbnR5X2ludGVydmFsKQoKaW50ZXJ2YWxfbWVhbl9hZ2UgPC0gc2FwcGx5KG5hbWVzKGFnZV91bmNlcnRhaW50eV9pbnRlcnZhbF90YWJsZSksIGZ1bmN0aW9uKHgpe0NldGFjZWFfb2NjW2NvbmRpdGlvbnMgJiBDZXRhY2VhX29jYyRhZ2VfdW5jZXJ0YWludHlfaW50ZXJ2YWw9PXgsXSRhZ2VfbWVhblsxXX0pCgppbnRlcnZhbF9kZW5zaXR5IDwtIHNhcHBseShuYW1lcyhhZ2VfdW5jZXJ0YWludHlfaW50ZXJ2YWxfdGFibGUpLCBmdW5jdGlvbih4KXtDZXRhY2VhX29jY1tjb25kaXRpb25zICYgQ2V0YWNlYV9vY2MkYWdlX3VuY2VydGFpbnR5X2ludGVydmFsPT14LF0kb2NjdXJyZW5jZV9kZW5zaXR5WzFdfSkKCmRmX2RlbnNpdHkgPC0gZGF0YS5mcmFtZSh4PWludGVydmFsX21lYW5fYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgeT1pbnRlcnZhbF9kZW5zaXR5KQoKZ2dwbG90KGRmX2RlbnNpdHksIGFlcyh4PXgsIHk9eSkpICsgCiAgZ2VvbV9wb2ludChhbHBoYT0wLjUpICsKICBnZW9tX3Ntb290aChmb3JtdWxhID0geX54LCBtZXRob2Q9bG0pICsgCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiVGltZSAoTXkpIikgKwogIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIk9jY3VycmVuY2UgZGVuc2l0eSIpICsKICBnZ3RpdGxlKCJDb3JyZWxhdGlvbiBiZXR3ZWVuIGRlbnNpdHkgYW5kIGFnZSIpICsKICBnZW9tX3RleHQoeCA9IDM1LCB5ID0gMjUsIGxhYmVsID0gbG1fZXFuKGRmX2RlbnNpdHkpLCBwYXJzZSA9IFRSVUUpCgojIEtlZXAgb25seSBvbmUgcG9pbnQgYnkgaWRlbnRpY2FsIHN0cmF0aWdyYXBoaWMgcmFuZ2UKc3RyYXRpZ3JhcGhpY19yYW5nZV90YWJsZSA8LSB0YWJsZShDZXRhY2VhX29jY1tjb25kaXRpb25zLF0kc3RyYXRpZ3JhcGhpY19yYW5nZSkKCnN0cmF0aWdyYXBoaWNfcmFuZ2VfbWVhbl9hZ2UgPC0gc2FwcGx5KG5hbWVzKHN0cmF0aWdyYXBoaWNfcmFuZ2VfdGFibGUpLCBmdW5jdGlvbih4KXtDZXRhY2VhX29jY1tjb25kaXRpb25zICYgQ2V0YWNlYV9vY2Mkc3RyYXRpZ3JhcGhpY19yYW5nZT09eCxdJHN0cmF0aWdyYXBoaWNfcmFuZ2VfbWlkcG9pbnRbMV19KQoKQ2V0YWNlYV9vY2Mkb2NjdXJyZW5jZV9jb21iaW5lZF9kZW5zaXR5IDwtIENldGFjZWFfb2NjJGFjY2VwdGVkX25hbWVfY291bnQvQ2V0YWNlYV9vY2Mkc3RyYXRpZ3JhcGhpY19yYW5nZV9kdXJhdGlvbgoKc3RyYXRpZ3JhcGhpY19yYW5nZV9kZW5zaXR5IDwtIHNhcHBseShuYW1lcyhzdHJhdGlncmFwaGljX3JhbmdlX3RhYmxlKSwgZnVuY3Rpb24oeCl7Q2V0YWNlYV9vY2NbY29uZGl0aW9ucyAmIENldGFjZWFfb2NjJHN0cmF0aWdyYXBoaWNfcmFuZ2U9PXgsXSRvY2N1cnJlbmNlX2NvbWJpbmVkX2RlbnNpdHlbMV19KQoKc3RyYXRpZ3JhcGhpY19yYW5nZV9kZl9kZW5zaXR5IDwtIGRhdGEuZnJhbWUoeD1zdHJhdGlncmFwaGljX3JhbmdlX21lYW5fYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5PXN0cmF0aWdyYXBoaWNfcmFuZ2VfZGVuc2l0eSkKCmdncGxvdChzdHJhdGlncmFwaGljX3JhbmdlX2RmX2RlbnNpdHksIGFlcyh4PXgsIHk9eSkpICsgCiAgZ2VvbV9wb2ludChhbHBoYT0wLjUpICsKICBnZW9tX3Ntb290aChmb3JtdWxhID0geX54LCBtZXRob2Q9bG0pICsgCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiVGltZSAoTXkpIikgKwogIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIkNvbWJpbmVkIG9jY3VycmVuY2UgZGVuc2l0eSIpICsKICBnZ3RpdGxlKCJDb3JyZWxhdGlvbiBiZXR3ZWVuIGNvbWJpbmVkIGRlbnNpdHkgYW5kIGFnZSIpICsKICBnZW9tX3RleHQoeCA9IDE1LCB5ID0gNiwgbGFiZWwgPSBsbV9lcW4oc3RyYXRpZ3JhcGhpY19yYW5nZV9kZl9kZW5zaXR5KSwgcGFyc2UgPSBUUlVFKQpgYGAKCiRcdG8kIFRoZSBkZW5zaXR5IGJhc2VkIG9uIGNvbWJpbmVkIHJhbmdlcyBzZWVtcyBsZXNzIHRpbWUtZGVwZW5kZW50IHRoYW4gdGhlIGRlbnNpdHkgYmFzZWQgb24gaW5pdGlhbCB0aW1lIHJhbmdlcy4gV2Ugd2lsbCB0aGVyZWZvcmUgdXNlIHRoZSBjb21iaW5lZCBkZW5zaXR5IGZvciBvdXIgY29ycmVjdGlvbnMuCgojIyBCSUFTIENPUlJFQ1RJT04gTsKwMzogU3Vic2FtcGxlIG9jY3VycmVuY2VzIGJ5IGhvbW9nZW5pemluZyB0aGUgY29tYmluZWQgb2NjdXJyZW5jZSBkZW5zaXR5CgoqKlN1YnNhbXBsaW5nIGJ5IGhvbW9nZW5pemF0aW9uKiogPSByZWR1Y2luZyB0aGUgZGlzY3JlcGFuY3kgYmV0d2VlbiBoaWdoIGFuZCBsb3cgb2NjdXJyZW5jZSBkZW5zaXRpZXMgYW1vbmcgdGF4YSBieSBzdWJzYW1wbGluZyBwcmVmZXJlbnRpYWxseSB0aGUgZGVuc2VzdCBvbmVzLgoKIyMjIENvbXBhcmUgZGVuc2l0aWVzIGJ5IGFjY2VwdGVkIG5hbWUgY291bnQgKHNwZWNpZXMgb25seSkKCkxldCdzIGZvY3VzIG5vdyBvbiB0aGUgb2NjdXJyZW5jZXMgYWNjZXB0ZWQgYXQgdGhlIHNwZWNpZXMgbGV2ZWwgYmVjYXVzZSB0aGV5IGFyZSB0aGUgb25lIGZvciB3aGljaCB3ZSBjYW4gY29ycmVjdCB0aGUgYWJ1bmRhbmNlIGJpYXMgYnkgc3Vic2FtcGxpbmcgdGhlIG1vc3QgY29uY2VudHJhdGVkIGNvbWJpbmVkIGludGVydmFscy4KCmBgYHtyLCBmaWcuYXNwPTAuNSwgZmlnLndpZHRoPTEyfQpjb25kaXRpb25zIDwtIENldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIgJiBDZXRhY2VhX29jYyRhZ2VfdW5jZXJ0YWludHk8MTAKCiMgZ2dwbG90KENldGFjZWFfb2NjW2NvbmRpdGlvbnMsXSwgYWVzKHg9b2NjdXJyZW5jZV9kZW5zaXR5LCBmaWxsPWZhY3RvcihhY2NlcHRlZF9uYW1lX2NvdW50KSkpICsKIyAgIGdlb21faGlzdG9ncmFtKGJpbndpZHRoPTAuMSkgKwojICAgc2NhbGVfeF9jb250aW51b3VzKHRyYW5zPSJsb2cxMCIsIG5hbWU9IkRlbnNpdHkgb2Ygb2NjdXJyZW5jZXMgKG51bWJlci9NeSkiKSArCiMgICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWU9IkFjY2VwdGVkIG5hbWUgY291bnQiKSArCiMgICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKIyAgIGdndGl0bGUoIkRpc3RyaWJ1dGlvbnMgb2Ygb2NjdXJyZW5jZSBkZW5zaXR5IGFtb25nIHNwZWNpZXMiKSArCiMgICBmYWNldF9ncmlkKGFjY2VwdGVkX25hbWVfY291bnQgfiAuLCBzY2FsZXMgPSAiZnJlZSIpCgpnZ3Bsb3QoQ2V0YWNlYV9vY2NbY29uZGl0aW9ucyxdLCBhZXMoeD1vY2N1cnJlbmNlX2NvbWJpbmVkX2RlbnNpdHksIGZpbGw9ZmFjdG9yKGFjY2VwdGVkX25hbWVfY291bnQpKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoPTAuMDUpICsKICBzY2FsZV94X2NvbnRpbnVvdXModHJhbnM9ImxvZzEwIiwgbmFtZT0iQ29tYmluZWQgZGVuc2l0eSBvZiBvY2N1cnJlbmNlcyAobnVtYmVyL015KSIpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWU9IkFjY2VwdGVkIG5hbWUgY291bnQiKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpKSArCiAgZ2d0aXRsZSgiRGlzdHJpYnV0aW9ucyBvZiBjb21iaW5lZCBvY2N1cnJlbmNlIGRlbnNpdHkgYW1vbmcgc3BlY2llcyIpICsKICBmYWNldF9ncmlkKGFjY2VwdGVkX25hbWVfY291bnQgfiAuLCBzY2FsZXMgPSAiZnJlZSIpCmBgYAoKJFx0byQgVGhlaXIgaXMgYSBodWdlIHNwYW4gb2YgZGVuc2l0aWVzIGRyaXZlbiBieSB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIGZvciB0aGUgc2FtZSBzcGVjaWVzIHRoYXQgd2UgY2FuIHJlZHVjZSBieSBzdWJzYW1wbGluZyB0aGUgbW9zdCBjb25jZW50cmF0ZWQgaW50ZXJ2YWxzLgoKIyMjIEltcGFjdCBvZiBjb3JyZWN0aW5nIHN1YnNhbXBsaW5nIG9uIGRlbnNpdHkgZGlzdHJpYnV0aW9ucyAoc3BlY2llcyBvbmx5KQoKYGBge3IsIGZpZy5hc3A9MC40LCBmaWcud2lkdGg9MTJ9CmNvbmRpdGlvbnMgPC0gQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuayA9PSJzcGVjaWVzIiAmIENldGFjZWFfb2NjJGFnZV91bmNlcnRhaW50eTwxMAoKIyBnZ3Bsb3QoQ2V0YWNlYV9vY2NbY29uZGl0aW9ucyxdLCBhZXMoeD1vY2N1cnJlbmNlX2NvbWJpbmVkX2RlbnNpdHksIGZpbGw9ZmFjdG9yKGFjY2VwdGVkX25hbWVfY291bnQpKSkgKwojICAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGg9MC4wNSkgKwojICAgc2NhbGVfeF9jb250aW51b3VzKHRyYW5zPSJsb2cxMCIsIG5hbWU9IkNvbWJpbmVkIGRlbnNpdHkgb2Ygb2NjdXJyZW5jZXMgKG51bWJlci9NeSkiKSArCiMgICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWU9IkFjY2VwdGVkIG5hbWUgY291bnQiKSArCiMgICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKIyAgIGdndGl0bGUocGFzdGUoIkRpc3RyaWJ1dGlvbnMgb2YgY29tYmluZWQgb2NjdXJyZW5jZSBkZW5zaXR5IGFtb25nIHNwZWNpZXMgKG4gPSAiLCBkaW0oQ2V0YWNlYV9vY2NbY29uZGl0aW9ucyxdKVsxXSwgIikiLCBzZXA9IiIpKSArCiMgICBmYWNldF9ncmlkKGFjY2VwdGVkX25hbWVfY291bnQgfiAuLCBzY2FsZXMgPSAiZnJlZSIpCgojIEFkZCBhdCBsZWFzdCBvbmUgb2NjdXJyZW5jZSBvZiBlYWNoIHNwZWNpZXMKQ2V0YWNlYV9vY2Nfc2FtcGxlZCA8LSBjKCkKQ2V0YWNlYV9vY2Nfbm90c2FtcGxlZCA8LSBjKCkKZm9yIChpIGluIGFzLm51bWVyaWMocm93Lm5hbWVzKENldGFjZWFfb2NjW2NvbmRpdGlvbnMsXSkpKXsKICByb3cgPC0gQ2V0YWNlYV9vY2NbYXMuY2hhcmFjdGVyKGkpLF0KICBpZiAoIShyb3ckYWNjZXB0ZWRfbmFtZSAlaW4lIENldGFjZWFfb2NjX3NhbXBsZWQkYWNjZXB0ZWRfbmFtZSkpewogICAgQ2V0YWNlYV9vY2Nfc2FtcGxlZCA8LSByYmluZChDZXRhY2VhX29jY19zYW1wbGVkLCByb3cpCiAgfWVsc2V7CiAgICBDZXRhY2VhX29jY19ub3RzYW1wbGVkIDwtIHJiaW5kKENldGFjZWFfb2NjX25vdHNhbXBsZWQsIHJvdykKICB9Cn0KCiMgQWRkIG9jY3VycmVuY2VzIGluIHRoZSByZW1hbmluZyBvbmVzLCBieSB1bmRlcndlaWdodGluZyBkZW5zZSBzcGVjaWVzCkNldGFjZWFfb2NjX3NhbXBsZWQgPC0gcmJpbmQoQ2V0YWNlYV9vY2Nfc2FtcGxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlX24oQ2V0YWNlYV9vY2Nfbm90c2FtcGxlZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9ODAwLWRpbShDZXRhY2VhX29jY19zYW1wbGVkKVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0PTEvQ2V0YWNlYV9vY2Nfbm90c2FtcGxlZCRvY2N1cnJlbmNlX2NvbWJpbmVkX2RlbnNpdHkqKjMpKQoKQ2V0YWNlYV9vY2Nfc2FtcGxlZCRtaW5fbWluX21hIDwtIGFwcGx5KENldGFjZWFfb2NjX3NhbXBsZWQsIDEsIGZ1bmN0aW9uKFgpe21pbihDZXRhY2VhX29jY19zYW1wbGVkW0NldGFjZWFfb2NjX3NhbXBsZWQkYWNjZXB0ZWRfbmFtZT09WFsiYWNjZXB0ZWRfbmFtZSJdLF0kbWluX21hKX0pCkNldGFjZWFfb2NjX3NhbXBsZWQkbWF4X21heF9tYSA8LSBhcHBseShDZXRhY2VhX29jY19zYW1wbGVkLCAxLCBmdW5jdGlvbihYKXttYXgoQ2V0YWNlYV9vY2Nfc2FtcGxlZFtDZXRhY2VhX29jY19zYW1wbGVkJGFjY2VwdGVkX25hbWU9PVhbImFjY2VwdGVkX25hbWUiXSxdJG1heF9tYSl9KQpDZXRhY2VhX29jY19zYW1wbGVkJHN0cmF0aWdyYXBoaWNfcmFuZ2VfZHVyYXRpb24gPC0gQ2V0YWNlYV9vY2Nfc2FtcGxlZCRtYXhfbWF4X21hLUNldGFjZWFfb2NjX3NhbXBsZWQkbWluX21pbl9tYQpDZXRhY2VhX29jY19zYW1wbGVkJGFjY2VwdGVkX25hbWVfY291bnQgPC0gc2FwcGx5KENldGFjZWFfb2NjX3NhbXBsZWQkYWNjZXB0ZWRfbmFtZSwgZnVuY3Rpb24oeCl7dGFibGUoQ2V0YWNlYV9vY2Nfc2FtcGxlZCRhY2NlcHRlZF9uYW1lKVt4XX0pCkNldGFjZWFfb2NjX3NhbXBsZWQkb2NjdXJyZW5jZV9jb21iaW5lZF9kZW5zaXR5IDwtIENldGFjZWFfb2NjX3NhbXBsZWQkYWNjZXB0ZWRfbmFtZV9jb3VudC9DZXRhY2VhX29jY19zYW1wbGVkJHN0cmF0aWdyYXBoaWNfcmFuZ2VfZHVyYXRpb24KCgpnZ3Bsb3QoQ2V0YWNlYV9vY2Nfc2FtcGxlZCwgYWVzKHg9b2NjdXJyZW5jZV9jb21iaW5lZF9kZW5zaXR5LCBmaWxsPWZhY3RvcihhY2NlcHRlZF9uYW1lX2NvdW50KSkpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aD0wLjA1KSArCiAgc2NhbGVfeF9jb250aW51b3VzKHRyYW5zPSJsb2cxMCIsIG5hbWU9IkNvbWJpbmVkIGRlbnNpdHkgb2Ygb2NjdXJyZW5jZXMgKG51bWJlci9NeSkiLCBsaW1pdHM9YygwLjEsIDEwMDApKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJBY2NlcHRlZCBuYW1lIGNvdW50IikgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGdndGl0bGUocGFzdGUoIkRpc3RyaWJ1dGlvbnMgb2YgY29tYmluZWQgb2NjdXJyZW5jZSBkZW5zaXR5IGFtb25nIHNwZWNpZXMsIGFmdGVyIHNhbXBsaW5nIChuID0gIiwgZGltKENldGFjZWFfb2NjX3NhbXBsZWQpWzFdLCAiKSIsIHNlcD0iIikpICsKICBmYWNldF9ncmlkKGFjY2VwdGVkX25hbWVfY291bnQgfiAuLCBzY2FsZXMgPSAiZnJlZSIpCmBgYAoKJFx0byQgU3Vic2FtcGxpbmcgYnkgaG9tb2dlbml6YXRpb24gc3VjY2Vzc2Z1bGx5IHJlZHVjZXMgdGhlIGRlbnNpdHkgc3BhbiBmcm9tIDIgdG8gMSBvcmRlciBvZiBtYWduaXR1ZGUuCgojIyMgSW1wYWN0IG9mIHN1YnNhbXBsaW5nIG9uIG9jY3VycmVuY2VzIHJlcGFydGl0aW9uIChzcGVjaWVzIG9ubHkpCgpTZWUgd2hhdCBvdXIgZGlzdHJpYnV0aW9ucyBsb29rIGxpa2UgYWZ0ZXIgc3Vic2FtcGxpbmc6CgpgYGB7ciwgZmlnLmFzcD0wLjUsIGZpZy53aWR0aD0xMn0KYnJlYWtzIDwtIGMoMC4xMjUsMC4yNSwwLjUsMSwyLDQsOCwxNikKCiMgZ2dwbG90KENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIgJiBDZXRhY2VhX29jYyRhZ2VfdW5jZXJ0YWludHk8MTAsXSwgYWVzKHg9LW1heF9tYSwgeT1hY2NlcHRlZF9uYW1lKSkgKwojICAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gLW1heF9tYXhfbWEsIHkgPSByZW9yZGVyKGFjY2VwdGVkX25hbWUsIC1zdHJhdGlncmFwaGljX3JhbmdlX21pZHBvaW50KSwgeGVuZCA9IC1taW5fbWluX21hLCB5ZW5kPXJlb3JkZXIoYWNjZXB0ZWRfbmFtZSwgLXN0cmF0aWdyYXBoaWNfcmFuZ2VfbWlkcG9pbnQpLCBjb2xvcj1vY2N1cnJlbmNlX2NvbWJpbmVkX2RlbnNpdHkpLCBhcnJvdz1hcnJvdyhlbmRzID0gImJvdGgiLCBhbmdsZT05MCwgbGVuZ3RoID0gdW5pdCgxLCAibW0iKSksIGFscGhhPTAuNSkgKwojICAgZ2VvbV9wb2ludChhZXMoeD0tYWdlX3J1bmlmKSwgY29sPSJyZWQiLCBjZXg9MC41LCBhbHBoYT0wLjUpICsKIyAgIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIlRpbWUgKE15KSIpICsKIyAgIHNjYWxlX3lfZGlzY3JldGUobmFtZSA9ICJTcGVjaWVzIikgKwojICAgbGFicyhjb2xvdXI9Ik9jY3VycmVuY2VcbmRlbnNpdHkiKSArCiMgICB0aGVtZShheGlzLnRleHQueT1lbGVtZW50X2JsYW5rKCksCiMgICAgICAgICBheGlzLnRpY2tzLnk9ZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpKSArCiMgICBzY2FsZV9jb2xvcl9ncmFkaWVudG4oY29sb3VycyA9IGMoImRhcmtibHVlIiwgImZvcmVzdGdyZWVuIiwgImJsYWNrIiksIHRyYW5zPSJsb2ciLCBicmVha3M9YnJlYWtzLCBsYWJlbHM9YnJlYWtzKSArIAojICAgZ2d0aXRsZShwYXN0ZSgiRGlzdHJpYnV0aW9ucyBvZiBzcGVjaWVzIGZvc3NpbCBhZ2UgdW5jZXJ0YWludGllcywgYmVmb3JlIGNvcnJlY3Rpbmcgc2FtcGxpbmcgKG4gPSAiLCBkaW0oQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuayA9PSJzcGVjaWVzIiAmIENldGFjZWFfb2NjJGFnZV91bmNlcnRhaW50eTwxMCxdKVsxXSwgIikiLCBzZXA9IiIpKQoKZ2dwbG90KENldGFjZWFfb2NjX3NhbXBsZWQsIGFlcyh4PS1tYXhfbWEsIHk9YWNjZXB0ZWRfbmFtZSkpICsKICBnZW9tX3NlZ21lbnQoYWVzKHggPSAtbWF4X21heF9tYSwgeSA9IHJlb3JkZXIoYWNjZXB0ZWRfbmFtZSwgLXN0cmF0aWdyYXBoaWNfcmFuZ2VfbWlkcG9pbnQpLCB4ZW5kID0gLW1pbl9taW5fbWEsIHllbmQ9cmVvcmRlcihhY2NlcHRlZF9uYW1lLCAtc3RyYXRpZ3JhcGhpY19yYW5nZV9taWRwb2ludCksIGNvbG9yPW9jY3VycmVuY2VfY29tYmluZWRfZGVuc2l0eSksIGFycm93PWFycm93KGVuZHMgPSAiYm90aCIsIGFuZ2xlPTkwLCBsZW5ndGggPSB1bml0KDEsICJtbSIpKSwgYWxwaGE9MC41KSArCiAgZ2VvbV9wb2ludChhZXMoeD0tYWdlX3J1bmlmKSwgY29sPSJyZWQiLCBjZXg9MC41LCBhbHBoYT0wLjUpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiAgc2NhbGVfeV9kaXNjcmV0ZShuYW1lID0gIlNwZWNpZXMiKSArCiAgbGFicyhjb2xvdXI9Ik9jY3VycmVuY2VcbmRlbnNpdHkiKSArCiAgdGhlbWUoYXhpcy50ZXh0Lnk9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueT1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpKSArCiAgc2NhbGVfY29sb3JfZ3JhZGllbnRuKGNvbG91cnMgPSBjKCJkYXJrYmx1ZSIsICJmb3Jlc3RncmVlbiIsICJibGFjayIpLCB0cmFucz0ibG9nIiwgYnJlYWtzPWJyZWFrcywgbGFiZWxzPWJyZWFrcykgKyAKICBnZ3RpdGxlKHBhc3RlKCJEaXN0cmlidXRpb25zIG9mIHNwZWNpZXMgZm9zc2lsIGFnZSB1bmNlcnRhaW50aWVzLCBhZnRlciBzdWJzYW1wbGluZyBieSBob21vZ2VuaXphdGlvbiAobiA9ICIsIGRpbShDZXRhY2VhX29jY19zYW1wbGVkKVsxXSwgIikiLCBzZXA9IiIpKQpgYGAKCiRcdG8kIFNvbWUgaGlnaGx5IGRlbnNlIGNsdXN0ZXIgYmVjYW1lIG11Y2ggbW9yZSBzaW1pbGFyIHRvIHRoZSBvdGhlcnMuCgpgYGB7ciBmaWcud2lkdGg9MTAsIGZpZy5hc3A9MC4zfQpjb25kaXRpb25zIDwtIENldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIgJiBDZXRhY2VhX29jYyRhZ2VfdW5jZXJ0YWludHk8MTAKCmdncGxvdChDZXRhY2VhX29jY1tjb25kaXRpb25zLF0sIGFlcyh4PS1hZ2VfcnVuaWYpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjUsIGFscGhhPTAuNSwgZmlsbD0icmVkIikgKwogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIlRpbWUgKE15KSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJOdW1iZXIgb2Ygb2NjdXJyZW5jZXMiKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJBY2NlcHRlZCByYW5rIikgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGdndGl0bGUocGFzdGUoIkV2b2x1dGlvbiBvZiB0aGUgc3BlY2llcyBvY2N1cnJlbmNlIG51bWJlciB0aHJvdWdoIHRpbWUgKG4gPSAiLCBkaW0oQ2V0YWNlYV9vY2NbY29uZGl0aW9ucyxdKVsxXSwgIikiLCBzZXA9IiIpKQoKZ2dwbG90KENldGFjZWFfb2NjX3NhbXBsZWQsIGFlcyh4PS1hZ2VfcnVuaWYpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjUsIGFscGhhPTAuNSwgZmlsbD0iYmx1ZSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiTnVtYmVyIG9mIG9jY3VycmVuY2VzIikgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZT0iQWNjZXB0ZWQgcmFuayIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKICBnZ3RpdGxlKHBhc3RlKCJFdm9sdXRpb24gb2YgdGhlIHNwZWNpZXMgb2NjdXJyZW5jZSBudW1iZXIgdGhyb3VnaCB0aW1lLCBhZnRlciBzdWJzYW1wbGluZyBieSBob21vZ2VuaXphdGlvbiAobiA9ICIsIGRpbShDZXRhY2VhX29jY19zYW1wbGVkKVsxXSwgIikiLCBzZXA9IiIpKQpgYGAKCklmIHdlIHN1cGVycG9zZSB0aGVzZSAyIHBsb3RzOgoKYGBge3IgZmlnLndpZHRoPTEwLCBmaWcuYXNwPTAuNH0KY29uZGl0aW9ucyA8LSBDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rID09InNwZWNpZXMiICYgQ2V0YWNlYV9vY2MkYWdlX3VuY2VydGFpbnR5PDEwCgpwMSA8LSBnZ3Bsb3QoQ2V0YWNlYV9vY2NbY29uZGl0aW9ucyxdLCBhZXMoeD0tYWdlX3J1bmlmKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMC41LCBhbHBoYT0wLjUsIGZpbGw9InJlZCIpICsKICB0aGVtZV92b2lkKCkKCnAyIDwtIGdncGxvdChDZXRhY2VhX29jY19zYW1wbGVkLCBhZXMoeD0tYWdlX3J1bmlmKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMC41LCBhbHBoYT0wLjUsIGZpbGw9ImJsdWUiKSArCiAgdGhlbWVfdm9pZCgpCgpwMSArIGFubm90YXRpb25fY3VzdG9tKGdncGxvdEdyb2IocDIpKQpgYGAKCiRcdG8kIFdlIGdldCB0aGUgbmV3IHNwZWNpZXMgb2NjdXJyZW5jZSBkaXN0cmlidXRpb24gYWZ0ZXIgc3Vic2FtcGxpbmcsIHRoYXQgY291bGQgYmUgdXNlZCBmb3IgZG9pbmcgaW5mZXJlbmNlIHdpdGggdGhlIG9jY3VycmVuY2UgYmlydGgtZGVhdGggbW9kZWwuCgojIyMgQ29tcGFyZSB3aXRoIGEgUG9pc3NvbiBzYW1wbGluZyBwcm9jZXNzCgpJbiBvcmRlciB0byBjaGVjayBpZiB0aGUgZGF0YSBmaXQgb3VyIGFzc3VtcHRpb25zIG9mIGNvbnN0YW50LWZvc3NpbGl6YXRpb24tcmF0ZSBQb2lzc29uIHNhbXBsaW5nIHdlIGNvbXBhcmUgdGhlIG9ic2VydmVkIG9jY3VycmVuY2VzIGRpc3RyaWJ1dGlvbnMgd2l0aCB0aGUgZXhwZWN0ZWQgb25lcy4gU3BlY2lmaWNhbGx5LCB3ZSB3aWxsIGxvb2sgYXQgdGhlIG51bWJlciBvZiB0YXhhIHJlcHJlc2VudGVkIGJ5IDEsIDIsIDMsIC4uLiBvY2N1cnJlbmNlcyBhbmQgdGhlIG9uZSB0aGF0IHdlIHdvdWxkIGV4cGVjdCBmb3IgYSBnaXZlbiBkaXN0cmlidXRpb24gb2Ygc3RyYXRpZ3JhcGhpYyByYW5nZXMgKHNlZW4gaGVyZSBhcyBhIHByb3h5IGZvciBzcGVjaWVzIGR1cmF0aW9uKS4KCmBgYHtyLCBmaWcuYXNwPTAuNSwgZmlnLndpZHRoPTEwfQpjb25kaXRpb25zIDwtICEoQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuayAlaW4lIGMoInN1YnNwZWNpZXMiLCAiaW5mcmFvcmRlciIpKSAmIENldGFjZWFfb2NjJGFnZV91bmNlcnRhaW50eTwxMAoKZ2dwbG90KENldGFjZWFfb2NjW2NvbmRpdGlvbnMsXSwgYWVzKHg9c3RyYXRpZ3JhcGhpY19yYW5nZV9kdXJhdGlvbiwgZmlsbD1hY2NlcHRlZF9yYW5rKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMSkgKyAKICAjZ2VvbV9wb2ludCgpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJBZ2UgcmFuZ2UgKE15KSIpICsKICAjc2NhbGVfeV9jb250aW51b3VzKHRyYW5zID0gImxvZzEwIiwgbmFtZSA9ICJDb3VudCAobG9nLXNjYWxlKSIpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWU9IkFjY2VwdGVkIHJhbmsiKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIikgKwogIGdndGl0bGUoIk9ic2VydmVkIGRpc3RyaWJ1dGlvbnMgb2Ygc3RyYXRpZ3JhcGhpYyByYW5nZXMiKSArCiAgZmFjZXRfZ3JpZCguIH4gYWNjZXB0ZWRfcmFuaywgc2NhbGVzID0gImZyZWUiKQoKZ2dwbG90KENldGFjZWFfb2NjW2NvbmRpdGlvbnMsXSwgYWVzKHg9YWNjZXB0ZWRfbmFtZV9jb3VudCwgeT0odGFibGUoYWNjZXB0ZWRfbmFtZV9jb3VudCkvYXMubnVtZXJpYyhuYW1lcyh0YWJsZShhY2NlcHRlZF9uYW1lX2NvdW50KSkpKVthcy5mYWN0b3IoYWNjZXB0ZWRfbmFtZV9jb3VudCldLCBjb2w9YWNjZXB0ZWRfcmFuaykpICsKICBnZW9tX3BvaW50KCkgKwogIHNjYWxlX3hfY29udGludW91cyh0cmFucyA9ICJsb2cxMCIsIG5hbWUgPSAiTnVtYmVyIG9mIG9jY3VycmVuY2VzIGJ5IGFjY2VwdGVkIG5hbWUgKGxvZy1zY2FsZSkiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zID0gImxvZzEwIiwgbmFtZSA9ICJOdW1iZXIgb2YgY29ycmVzcG9uZGluZyBhY2NlcHRlZCBuYW1lcyAobG9nLXNjYWxlKSIpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWU9IkFjY2VwdGVkIHJhbmsiKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKICBnZ3RpdGxlKCJPYnNlcnZlZCBkaXN0cmlidXRpb25zIG9mIHRoZSBudW1iZXIgb2YgYWNjZXB0ZWQgbmFtZXMgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMiKSArCiAgZmFjZXRfZ3JpZChhY2NlcHRlZF9yYW5rIH4gLiwgc2NhbGVzID0gImZyZWUiKQpgYGAKCkluIGEgUG9pc3NvbiBwcm9jZXNzIHdpdGggb2NjdXJyZW5jZSBzYW1wbGluZyByYXRlICRcb21lZ2EkIGFuZCBmb3IgYSBnaXZlbiB0aW1lIGludGVydmFsIG9mIGxlbmd0aCAkdCQsIHRoZSBwcm9iYWJpbGl0eSBvZiBvYnNlcnZpbmcgJE5fdCA9IGskIG9jY3VycmVuY2VzIGlzIGdpdmVuIGJ5IHRoZSBQb2lzc29uIGRpc3RyaWJ1dGlvbiBvZiBtZWFuIG9mIHBhcmFtZXRlciAkXG9tZWdhXHRpbWVzIHQkOiAKCiQkXG1hdGhiYntQfShOX3Q9aykgPSBlXnstXG9tZWdhIHR9XGZyYWN7KFxvbWVnYSB0KV5rfXtrIX0kJAoKU28gaW4gb3JkZXIgdG8gaGF2ZSB0aGUgYWJzb2x1dGUgcHJvYmFiaWxpdHkgb2Ygb2JzZXJ2aW5nICROXzAgPSBuJCBvY2N1cnJlbmNlcyB3ZSBoYXZlIHRvIGludGVncmF0ZSBvdmVyIHRoZSBmdWxsIGRpc3RyaWJ1dGlvbiBvZiBhZ2UgdW5jZXJ0YWludGllcyAkdCQsIGNhbGxlZCAkZih0KSQ6CgokJFxtYXRoYmJ7UH0oTl8wID0gbikgPSBcaW50X3QgUChOX3QgPSBuKSBmKHQpIGR0ID0gXGludF90IGVeey1cb21lZ2EgdH1cZnJhY3soXG9tZWdhIHQpXm59e24hfSBmKHQpIGR0JCQKCkZpcnN0LCAgYXBwcm94aW1hdGUgdGhpcyBkaXN0cmlidXRpb246CgpgYGB7cn0KcmFuZ2VfZGVuc2l0eSA8LSBhcHByb3hmdW4oZGVuc2l0eShDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSRzdHJhdGlncmFwaGljX3JhbmdlX2R1cmF0aW9uW2lzLmZpbml0ZShDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSRzdHJhdGlncmFwaGljX3JhbmdlX2R1cmF0aW9uKV0pKQoKaGlzdChDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSRzdHJhdGlncmFwaGljX3JhbmdlX2R1cmF0aW9uLCBwcm9iYWJpbGl0eSA9IFQsIGJyZWFrcyA9IDIwLCBtYWluPSJEZW5zaXR5IGFwcHJveGltYXRpb24gb2YgdGhlIGVtcGlyaWNhbCBzdHJhdGlncmFwaGljIHJhbmdlIGRpc3RyaWJ1dGlvbiIsIHhsYWIgPSAiQWdlIHJhbmdlIChNeSkiKQpsaW5lcygxOjEwMC81LCByYW5nZV9kZW5zaXR5KDE6MTAwLzUpKQpgYGAKClRoZW4gaW50ZWdyYXRlIGFuZCBwbG90IHRoZSBleHBlY3RlZCBkaXN0cmlidXRpb24gZm9yIGEgZ2l2ZW4gb21lZ2E6CgpgYGB7ciBmaWcuYXNwPTAuMywgZmlnLndpZHRoPTExfQpleHBlY3RlZF9kaXN0cmlidXRpb24gPC0gZnVuY3Rpb24obiwgb21lZ2EsIHN0cmF0aWdyYXBoaWNfcmFuZ2VfZHVyYXRpb24pewogIHJhbmdlX2RlbnNpdHkgPC0gYXBwcm94ZnVuKGRlbnNpdHkoc3RyYXRpZ3JhcGhpY19yYW5nZV9kdXJhdGlvbltpcy5maW5pdGUoc3RyYXRpZ3JhcGhpY19yYW5nZV9kdXJhdGlvbildKSkKICBnIDwtIGZ1bmN0aW9uKHQpe2Rwb2lzKG4sIG9tZWdhKnQpKnJhbmdlX2RlbnNpdHkodCl9CiAgcmV0dXJuIChpbnRlZ3JhdGUoZywgbG93ZXIgPSAxLCB1cHBlciA9IG1heChzdHJhdGlncmFwaGljX3JhbmdlX2R1cmF0aW9uKSkpCn0KCm9tZWdhIDwtIDAuMQoKZGVucyA8LSBzYXBwbHkoMDoyMCwgZnVuY3Rpb24obil7ZXhwZWN0ZWRfZGlzdHJpYnV0aW9uKG4sIG9tZWdhLCBDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSRzdHJhdGlncmFwaGljX3JhbmdlX2R1cmF0aW9uKSR2YWx1ZX0pCgpwbG90KDA6MjAsIGRlbnMsIG1haW49IkV4cGVjdGVkIGRpc3RyaWJ1dGlvbiBvZiB0aGUgbnVtYmVyIG9mIGFjY2VwdGVkIG5hbWVzIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIiwgeGxhYj0iTnVtYmVyIG9mIG9jY3VycmVuY2VzIHdpdGggdGhlIHNhbWUgYWNjZXB0ZWQgbmFtZSIsIHlsYWIgPSAiUHJvcG9ydGlvbnMiLCB0eXBlID0gImIiKQpgYGAKCkZpbmFsbHksIHRyeSB0byBmaW5kIGFuICRcb21lZ2EkIHZhbHVlIHRoYXQgYXBwcm94aW1hdGVseSBmaXRzIHRoZSBmaXJzdCBwb2ludHMgKHRoZSBsZWFzdCBhZmZlY3RlZCBieSBvdmVyc2FtcGxpbmcgYmlhc2VzKSBhbmQgY2hlY2sgaWYgdGhlIG90aGVyIHBvaW50cyBmb2xsb3cgdGhlIGV4cGVjdGVkIGN1cnZlOgoKYGBge3IgZmlnLndpZHRoPTEwLCBmaWcuYXNwPTAuNH0KIyBSZWNvdW50IHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgd2l0aCB0aGUgc2FtZSBhY2NlcHRlZCBuYW1lIGFmdGVyIHRoZSBzYW1wbGluZwpDZXRhY2VhX29jY19zYW1wbGVkJGFjY2VwdGVkX25hbWVfY291bnQgPC0gc2FwcGx5KENldGFjZWFfb2NjX3NhbXBsZWQkYWNjZXB0ZWRfbmFtZSwgZnVuY3Rpb24oeCl7dGFibGUoQ2V0YWNlYV9vY2Nfc2FtcGxlZCRhY2NlcHRlZF9uYW1lKVt4XX0pCgpvbWVnYSA8LSAwLjEKYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzIDwtIENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3Jhbms9PSJzcGVjaWVzIixdJGFjY2VwdGVkX25hbWVfY291bnQKZGVucyA8LSBzYXBwbHkoMTptYXgoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzKSwgZnVuY3Rpb24obil7IGV4cGVjdGVkX2Rpc3RyaWJ1dGlvbihuLCBvbWVnYSwgQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuaz09InNwZWNpZXMiLF0kc3RyYXRpZ3JhcGhpY19yYW5nZV9kdXJhdGlvbikkdmFsdWUgfSkKYWNjZXB0ZWRfbmFtZV9jb3VudF9jYXRlZ29yaWVzIDwtIHRhYmxlKGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llcykvYXMubnVtZXJpYyhuYW1lcyh0YWJsZShhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXMpKSkgICMgTnVtYmVyIG9mIGNhdGVnb3JpZXMgd2l0aCAxLCAyLCAzLCAuLi4gb2NjdXJyZW5jZXMgb2YgdGhlIHNhbWUgc3BlY2llcwoKIyBDb21wYXJlIHRoZSBpbml0aWFsIG9ic2VydmVkIGRpc3RyaWJ1dGlvbiB3aXRoIHRoZSB0aGVvcmV0aWNhbCBjdXJ2ZQpnZ3Bsb3QoQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuaz09InNwZWNpZXMiLF0sCiAgICAgICBhZXMoeD1hY2NlcHRlZF9uYW1lX2NvdW50LCAKICAgICAgICAgICB5PWFjY2VwdGVkX25hbWVfY291bnRfY2F0ZWdvcmllc1thcy5mYWN0b3IoYWNjZXB0ZWRfbmFtZV9jb3VudCldLCAKICAgICAgICAgICBmaWxsPWFjY2VwdGVkX3JhbmspKSArCiAgZ2VvbV9wb2ludCgpICsKICAKICBhbm5vdGF0ZSgibGluZSIsIHggPSAxOm1heChhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXMpLCB5PSBkZW5zCiAgICAqbWF4KGFjY2VwdGVkX25hbWVfY291bnRfY2F0ZWdvcmllc1thcy5mYWN0b3IoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzKV0pIC9tYXgoZGVucykpKwogIAogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIk51bWJlciBvZiBvY2N1cnJlbmNlcyBieSBhY2NlcHRlZCBuYW1lIikgKwogIHNjYWxlX3lfY29udGludW91cyh0cmFucyA9ICJsb2cxMCIsIG5hbWUgPSAiTnVtYmVyIG9mIGNvcnJlc3BvbmRpbmcgYWNjZXB0ZWQgbmFtZXMgKGxvZy1zY2FsZSkiKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJPYnNlcnZlZCBkaXN0cmlidXRpb24iKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKICBnZ3RpdGxlKCJDb21wYXJpc29uIGJldHdlZW4gZXhwZWN0ZWQgYW5kIG9ic2VydmVkIGRpc3RyaWJ1dGlvbnMgb2YgbnVtYmVyIG9mIG9jY3VycmVuY2VzIikgKwogIGZhY2V0X2dyaWQoYWNjZXB0ZWRfcmFuayB+IC4sIHNjYWxlcyA9ICJmcmVlIikKCmFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19zYW1wbGVkIDwtIENldGFjZWFfb2NjX3NhbXBsZWRbQ2V0YWNlYV9vY2Nfc2FtcGxlZCRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSRhY2NlcHRlZF9uYW1lX2NvdW50CmRlbnNfc2FtcGxlZCA8LSBzYXBwbHkoMTptYXgoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzX3NhbXBsZWQpLCBmdW5jdGlvbihuKXsKICAgICBleHBlY3RlZF9kaXN0cmlidXRpb24obiwgb21lZ2EsIENldGFjZWFfb2NjX3NhbXBsZWRbQ2V0YWNlYV9vY2Nfc2FtcGxlZCRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSRzdHJhdGlncmFwaGljX3JhbmdlX2R1cmF0aW9uKSR2YWx1ZQogICAgfSkKYWNjZXB0ZWRfbmFtZV9jb3VudF9jYXRlZ29yaWVzX3NhbXBsZWQgPC0gdGFibGUoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzX3NhbXBsZWQpL2FzLm51bWVyaWMobmFtZXModGFibGUoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzX3NhbXBsZWQpKSkgICMgTnVtYmVyIG9mIGNhdGVnb3JpZXMgd2l0aCAxLCAyLCAzLCAuLi4gb2NjdXJyZW5jZXMgb2YgdGhlIHNhbWUgc3BlY2llcwoKIyBDb21wYXJlIHRoZSBjb3JyZWN0ZWQgb2JzZXJ2ZWQgZGlzdHJpYnV0aW9uIHdpdGggdGhlIHRoZW9yZXRpY2FsIGN1cnZlCmdncGxvdChDZXRhY2VhX29jY19zYW1wbGVkW0NldGFjZWFfb2NjX3NhbXBsZWQkYWNjZXB0ZWRfcmFuaz09InNwZWNpZXMiLF0sIAogICAgICAgYWVzKHg9YWNjZXB0ZWRfbmFtZV9jb3VudCwKICAgICAgICAgICB5PWFjY2VwdGVkX25hbWVfY291bnRfY2F0ZWdvcmllc19zYW1wbGVkW2FzLmZhY3RvcihhY2NlcHRlZF9uYW1lX2NvdW50KV0sCiAgICAgICAgICAgZmlsbD1hY2NlcHRlZF9yYW5rKSkgKwogIGdlb21fcG9pbnQoKSArCiAgCiAgYW5ub3RhdGUoImxpbmUiLCB4ID0gMTptYXgoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzX3NhbXBsZWQpLCB5PSBkZW5zX3NhbXBsZWQKICAgICptYXgoYWNjZXB0ZWRfbmFtZV9jb3VudF9jYXRlZ29yaWVzX3NhbXBsZWRbYXMuZmFjdG9yKGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19zYW1wbGVkKV0pIC9tYXgoZGVuc19zYW1wbGVkKSkgKwogIAogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIk51bWJlciBvZiBvY2N1cnJlbmNlcyBieSBhY2NlcHRlZCBuYW1lIikgKwogIHNjYWxlX3lfY29udGludW91cyh0cmFucyA9ICJsb2cxMCIsIG5hbWUgPSAiTnVtYmVyIG9mIGNvcnJlc3BvbmRpbmcgYWNjZXB0ZWQgbmFtZXMgKGxvZy1zY2FsZSkiKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJPYnNlcnZlZCBkaXN0cmlidXRpb24iKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKICBnZ3RpdGxlKCJDb21wYXJpc29uIGJldHdlZW4gZXhwZWN0ZWQgYW5kIG9ic2VydmVkIGRpc3RyaWJ1dGlvbnMgb2YgbnVtYmVyIG9mIG9jY3VycmVuY2VzLCBhZnRlciBzYW1wbGluZyIpICsKICBmYWNldF9ncmlkKGFjY2VwdGVkX3JhbmsgfiAuLCBzY2FsZXMgPSAiZnJlZSIpCmBgYAoKJFxpbXBsaWVzJCBJbml0aWFsIG9ic2VydmF0aW9ucyByZWFsbHkgZG8gbm90IGZpdCB0aGUgZXhwZWN0YXRpb25zLCAqKnNwZWNpZXMgd2l0aCBtb3JlIHRoYW4gNSBvY2N1cnJlbmNlcyBtdXN0IHJlbWFpbiB2ZXJ5IHJhcmUqKiAhIEJ1dCBvdXIgc3Vic2FtcGxpbmcgc2VlbXMgdG8gY29ycmVjdCBtb3N0IG9mIHRoaXMgYmlhcy4KCkhvd2V2ZXIsIHRoaXMgbWV0aG9kIHJlcXVpcmVzIHRvIG1ha2Ugc2V2ZXJhbCBhcmJpdHJhcnkgY2hvaWNlcyB0aGF0IG1heSBpbnRyb2R1Y2UgbmV3IGJpYXNlcyBzbyB3ZSB3aWxsIGluc3RlYWQgc3Vic2FtcGxlIGF0IG90aGVyIGxldmVscyAocGFsYWVvbnRvbG9naWNhbCBjb2xsZWN0aW9uLCBnZW9sb2dpY2FsIGZvcm1hdGlvbikuIEluIGVhY2ggY2FzZSBvbmx5IG9uZSBvY2N1cnJlbmNlIHdpbGwgYmUgc2FtcGxlZCBmb3IgdGhlIHNpbWlsYXJseSBpZGVudGlmaWVkLCBhIHByb2Nlc3Mgd2Ugd2lsbCByZWZlciB0byBhcyAqKmFnZ3JlZ2F0aW5nKiogdGhlc2Ugb2NjdXJyZW5jZXMgYWNjb3JkaW5nIHRvIHRoZSBjaG9zZW4gZmFjdG9yLgoKIyMgQklBUyBDT1JSRUNUSU9OIE7CsDNiaXM6IFN1YnNhbXBsZSBvY2N1cnJlbmNlcyBieSBhZ2dyZWdhdGluZyBzaW1pbGFybHkgaWRlbnRpZmllZCBvY2N1cnJlbmNlcyBpbiBlYWNoIGNvbGxlY3Rpb24KCioqU3Vic2FtcGxpbmcgYnkgYWdncmVnYXRpb24qKiA9IGFnZ3JlZ2F0ZSBhbGwgdGhlIG9jY3VycmVuY2VzIG9mIGEgZ2l2ZW4gdGF4b24gYWNjb3JkaW5nIHRvIGEgZ2l2ZW4gY3JpdGVyaW9uIChjb2xsZWN0aW9uLCBnZW9sb2dpY2FsIGZvcm1hdGlvbiwgY291bnRyeSwgZ2VvbG9naWNhbCBwbGF0ZSkuCgojIyBXcm9uZyB0cmFjazogQWdncmVnYXRlIHNpbWlsYXJseSBpZGVudGlmaWVkIG9jY3VycmVuY2VzIGluIGVhY2ggY29sbGVjdGlvbgoKSW4gb3JkZXIgdG8gcmVkdWNlIHRoZSBhYnVuZGFuY2UgYmlhcywgd2UgbWF5IGtlZXAgb25seSBvbmUgb2NjdXJyZW5jZSBmb3IgZWFjaCBjb2xsZWN0aW9uOgoKYGBge3J9CkNldGFjZWFfb2NjX2FnZ3JlZyA8LSBjKCkKCiMgQnJvd3NlIGFsbCBjb2xsZWN0aW9ucwpjb2xsZWN0aW9ucyA8LSBsZXZlbHMoZHJvcGxldmVscyhDZXRhY2VhX29jYyRjb2xsZWN0aW9uX25vKSkKZm9yIChjb2xsIGluIGNvbGxlY3Rpb25zKXsKICBDZXRhY2VhX29jY19jb2xsIDwtIENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGNvbGxlY3Rpb25fbm89PWNvbGwsXQogIAogICMgQnJvd3NlIGFsbCBhY2NlcHRlZCBuYW1lcyBpbiBlYWNoIGNvbGxlY3Rpb24gJiBzYW1wbGUgb25seSAxIG9jY3VycmVuY2UKICB0YXhhIDwtIGxldmVscyhkcm9wbGV2ZWxzKENldGFjZWFfb2NjX2NvbGwkYWNjZXB0ZWRfbmFtZSkpCiAgZm9yIChuYW1lIGluIHRheGEpewogICAgQ2V0YWNlYV9vY2NfYWdncmVnIDwtIHJiaW5kKENldGFjZWFfb2NjX2FnZ3JlZywgc2FtcGxlX24oQ2V0YWNlYV9vY2NfY29sbFtDZXRhY2VhX29jY19jb2xsJGFjY2VwdGVkX25hbWU9PW5hbWUsXSwgc2l6ZSA9IDEpKQogIH0KfQoKZGF0YS5mcmFtZShDZXRhY2VhX29jYyA9IGMoZGltKENldGFjZWFfb2NjKVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltKENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIsXSlbMV0pLAogICAgICAgICAgIENldGFjZWFfb2NjX2FnZ3JlZyA9IGMoZGltKENldGFjZWFfb2NjX2FnZ3JlZylbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaW0oQ2V0YWNlYV9vY2NfYWdncmVnW0NldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9yYW5rID09InNwZWNpZXMiLF0pWzFdKSwKICAgICAgICAgICByZW1vdmVkID0gYyhkaW0oQ2V0YWNlYV9vY2MpWzFdLWRpbShDZXRhY2VhX29jY19hZ2dyZWcpWzFdLAogICAgICAgICAgICAgICAgICAgICAgIGRpbShDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rID09InNwZWNpZXMiLF0pWzFdLWRpbShDZXRhY2VhX29jY19hZ2dyZWdbQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIsXSlbMV0pLAogICAgICAgICAgIHJvdy5uYW1lcyA9IGMoIk51bWJlciBvZiBvY2N1cnJlbmNlcyIsICJOdW1iZXIgb2Ygb2NjdXJyZW5jZXMgKHNwZWNpZXMgb25seSkiKSkKYGBgCgokXHRvJCBOb3QgZW5vdWdoIG9jY3VycmVuY2VzIGFyZSByZW1vdmVkIHRvIG1ha2UgYSBzdWZmaWNpZW50IGRpZmZlcmVuY2UuIElmIHdlIGxvb2sgYXQgdGhlIGNvbGxlY3Rpb24gd2l0aCB0aGUgaGlnaGVzdCBudW1iZXIgb2Ygb2NjdXJyZW5jZXM6CgpgYGB7cn0KY29sbGVjdGlvbl9tYXhfb2NjdXJyZW5jZXMgPC0gbWF4KHRhYmxlKENldGFjZWFfb2NjJGNvbGxlY3Rpb25fbm8pW0NldGFjZWFfb2NjJGNvbGxlY3Rpb25fbm9dKQpjb2xsZWN0aW9uX21heF9ubyA8LSBuYW1lcyh0YWJsZShDZXRhY2VhX29jYyRjb2xsZWN0aW9uX25vKVtDZXRhY2VhX29jYyRjb2xsZWN0aW9uX25vXVt0YWJsZShDZXRhY2VhX29jYyRjb2xsZWN0aW9uX25vKVtDZXRhY2VhX29jYyRjb2xsZWN0aW9uX25vXT09Y29sbGVjdGlvbl9tYXhfb2NjdXJyZW5jZXNdWzFdKQoKdGFibGUoZHJvcGxldmVscyhDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRjb2xsZWN0aW9uX25vPT1jb2xsZWN0aW9uX21heF9ubyxdJGFjY2VwdGVkX25hbWUpKQpgYGAKCiRcdG8kIFRoZXJlIGFyZSB2ZXJ5IGZldyByZWR1bmRhbmNpZXMgYW1vbmcgdGhlIGFjY2VwdGVkIG5hbWVzIGluIGNvbGxlY3Rpb25zIHNvIGFnZ3JlZ2F0aW5nIHRob3NlIHdvbid0IHJlZHVjZSB0aGUgYWJ1bmRhbmNlIGJpYXMuCgpJbnN0ZWFkLCB3ZSBtYXkgdHJ5IHRvICoqYWdncmVnYXRlIG9jY3VycmVuY2VzIHdpdGggdGhlIHNhbWUgYWNjZXB0ZWQgbmFtZSBhdCB0aGUgbGV2ZWwgb2YgdGhlIGdlb2xvZ2ljYWwgZm9ybWF0aW9uKiogKGllIHN1YnNhbXBsZSBvbmx5IG9uZSBmb3IgZWFjaCkuCgojIyBBZ2dyZWdhdGUgc2ltaWxhcmx5IGlkZW50aWZpZWQgb2NjdXJyZW5jZXMgaW4gZWFjaCBmb3JtYXRpb24KCmBgYHtyIGZpZy5oZWlnaHQ9OCwgaW5jbHVkZT1GfQpDZXRhY2VhX29jY19zcGVjaWVzIDwtIENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3Jhbms9PSJzcGVjaWVzIixdCgojIEJyb3dzZSBhbGwgbnVtYmVycyBvZiBvY2N1cnJlbmNlcyBieSBmb3JtYXRpb24KZm9ybWF0aW9uX29jY3VycmVuY2VzX25iIDwtIGFzLm51bWVyaWMobmFtZXModGFibGUodGFibGUoZHJvcGxldmVscyhDZXRhY2VhX29jY19zcGVjaWVzJGZvcm1hdGlvbikpKSkpCgpmb3IgKG4gaW4gbGlzdChjKDQsIDcpLCBjKDgsIDE1KSwgYygxNiwgMTI0KSkpewogIEEgPC0gQ2V0YWNlYV9vY2Nfc3BlY2llc1thcy5sb2dpY2FsKHRhYmxlKENldGFjZWFfb2NjX3NwZWNpZXMkZm9ybWF0aW9uKVtDZXRhY2VhX29jY19zcGVjaWVzJGZvcm1hdGlvbl0+PW5bMV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICYgYXMubG9naWNhbCh0YWJsZShDZXRhY2VhX29jY19zcGVjaWVzJGZvcm1hdGlvbilbQ2V0YWNlYV9vY2Nfc3BlY2llcyRmb3JtYXRpb25dPD1uWzJdKSxdCiAgQSRmb3JtYXRpb24gPC0gZHJvcGxldmVscyhBJGZvcm1hdGlvbikKCiAgcCA8LSBnZ3Bsb3QoQSwgYWVzKHg9LWFnZV9tZWFuLCBmaWxsPWFjY2VwdGVkX25hbWUpKSArCiAgICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDAuNSwgY29sPSJibGFjayIpICsKICAgIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIlRpbWUgKE15KSIpICsKICAgIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIk51bWJlciBvZiBvY2N1cnJlbmNlcyBpbiB0aGUgZm9ybWF0aW9uIikgKwogICAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJBY2NlcHRlZCBuYW1lIikgKwogICAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICBnZ3RpdGxlKHBhc3RlKCJEaXN0cmlidXRpb24gb2Ygb2NjdXJyZW5jZXMnIG1lYW4gYWdlIGZvciBmb3JtYXRpb25zIHdpdGgiLCBuWzFdLCAiLSIsIG5bMl0sICJvY2N1cnJlbmNlcyAoY29sb3JlZCBieSBzcGVjaWVzKSIpKSArCiAgICBmYWNldF9ncmlkKGZvcm1hdGlvbiB+IC4sIHNjYWxlcz0iZnJlZSIpCiAgcHJpbnQocCkKfQoKbWF4X3NwZWNpZXNfYnlfZm9ybWF0aW9uIDwtIG1heCh0YWJsZShDZXRhY2VhX29jY19zcGVjaWVzJGZvcm1hdGlvbikpCkEgPC0gQ2V0YWNlYV9vY2Nfc3BlY2llc1thcy5sb2dpY2FsKHRhYmxlKENldGFjZWFfb2NjX3NwZWNpZXMkZm9ybWF0aW9uKVtDZXRhY2VhX29jY19zcGVjaWVzJGZvcm1hdGlvbl09PW1heF9zcGVjaWVzX2J5X2Zvcm1hdGlvbiksXQpBJGZvcm1hdGlvbiA8LSBkcm9wbGV2ZWxzKEEkZm9ybWF0aW9uKQoKZ2dwbG90KEEsIGFlcyh4PS1hZ2VfbWVhbiwgZmlsbD1yZW9yZGVyKGFjY2VwdGVkX25hbWUsIC1hZ2VfbWVhbikpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjUsIGNvbD0iYmxhY2siKSArCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiVGltZSAoTXkpIikgKwogIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIk51bWJlciBvZiBvY2N1cnJlbmNlcyBpbiB0aGUgZm9ybWF0aW9uIikgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZT0iQWNjZXB0ZWQgbmFtZSIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgZ2d0aXRsZShwYXN0ZSgiRGlzdHJpYnV0aW9uIG9mIG9jY3VycmVuY2VzJyBtZWFuIGFnZSBmb3IiLCBtYXhfc3BlY2llc19ieV9mb3JtYXRpb24sICJvY2N1cnJlbmNlcyB3aXRob3V0IGluZGljYXRlZCBmb3JtYXRpb24gKGNvbG9yZWQgYnkgc3BlY2llcykiKSkgKwogIGZhY2V0X2dyaWQoZm9ybWF0aW9uIH4gLikKCiMgJFx0byQgRm9yIG1vc3QgZm9ybWF0aW9ucyBlYWNoIHNwZWNpZXMgc2VlbXMgdG8gYmUgcmVzdHJpY3RlZCB0byBvbmx5IG9uZSBhZ2UsIHNvIGFzIGV4cGVjdGVkIHdlIGFyZSBub3QgbG9vc2luZyB0b28gbXVjaCBpbmZvcm1hdGlvbiB3aGVuIGFnZ3JlZ2F0aW5nIHRoZW0gdG8gYSBzaW5nbGUgb2NjdXJyZW5jZS4KYGBgCgpgYGB7cn0KQ2V0YWNlYV9vY2NfYWdncmVnIDwtIGMoKQoKIyBCcm93c2UgYWxsIGZvcm1hdGlvbnMKZm9ybWF0aW9ucyA8LSBsZXZlbHMoZHJvcGxldmVscyhDZXRhY2VhX29jYyRmb3JtYXRpb24pKQpmb3IgKGZvcm0gaW4gZm9ybWF0aW9ucyl7CiAgQ2V0YWNlYV9vY2NfZm9ybSA8LSBDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRmb3JtYXRpb249PWZvcm0sXQogIAogICMgQnJvd3NlIGFsbCBhY2NlcHRlZCBuYW1lcyBpbiBlYWNoIGZvcm1hdGlvbiAmIHNhbXBsZSBvbmx5IDEgb2NjdXJyZW5jZQogIHRheGEgPC0gbGV2ZWxzKGRyb3BsZXZlbHMoQ2V0YWNlYV9vY2NfZm9ybSRhY2NlcHRlZF9uYW1lKSkKICBmb3IgKG5hbWUgaW4gdGF4YSl7CiAgICBDZXRhY2VhX29jY19hZ2dyZWcgPC0gcmJpbmQoQ2V0YWNlYV9vY2NfYWdncmVnLCBzYW1wbGVfbihDZXRhY2VhX29jY19mb3JtW0NldGFjZWFfb2NjX2Zvcm0kYWNjZXB0ZWRfbmFtZT09bmFtZSxdLCBzaXplID0gMSkpCiAgfQp9CgpkYXRhLmZyYW1lKENldGFjZWFfb2NjID0gYyhkaW0oQ2V0YWNlYV9vY2MpWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkaW0oQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuayA9PSJzcGVjaWVzIixdKVsxXSksCiAgICAgICAgICAgQ2V0YWNlYV9vY2NfYWdncmVnID0gYyhkaW0oQ2V0YWNlYV9vY2NfYWdncmVnKVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbShDZXRhY2VhX29jY19hZ2dyZWdbQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIsXSlbMV0pLAogICAgICAgICAgIHJlbW92ZWQgPSBjKGRpbShDZXRhY2VhX29jYylbMV0tZGltKENldGFjZWFfb2NjX2FnZ3JlZylbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgZGltKENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIsXSlbMV0tZGltKENldGFjZWFfb2NjX2FnZ3JlZ1tDZXRhY2VhX29jY19hZ2dyZWckYWNjZXB0ZWRfcmFuayA9PSJzcGVjaWVzIixdKVsxXSksCiAgICAgICAgICAgcm93Lm5hbWVzID0gYygiTnVtYmVyIG9mIG9jY3VycmVuY2VzIiwgIk51bWJlciBvZiBvY2N1cnJlbmNlcyAoc3BlY2llcyBvbmx5KSIpKQpgYGAKCiRcdG8kIEluIHRoYXQgY2FzZSB0aGUgc3ViLXNhbXBsaW5nIGlzIGJpZyBlbm91Z2ggdG8gaG9wZSBjb3JyZWN0aW5nIG91ciBiaWFzLgoKYGBge3IgZmlnLndpZHRoPTEwLCBmaWcuYXNwPTAuNH0KIyBSZWNvdW50IHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgd2l0aCB0aGUgc2FtZSBhY2NlcHRlZCBuYW1lIGFmdGVyIHRoZSBhZ2dyZWdhdGlvbgpDZXRhY2VhX29jY19hZ2dyZWckYWNjZXB0ZWRfbmFtZV9jb3VudCA8LSBzYXBwbHkoQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX25hbWUsIGZ1bmN0aW9uKHgpe3RhYmxlKENldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9uYW1lKVt4XX0pCgpvbWVnYSA8LSAwLjEKYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzIDwtIENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3Jhbms9PSJzcGVjaWVzIixdJGFjY2VwdGVkX25hbWVfY291bnQKZGVucyA8LSBzYXBwbHkoMTptYXgoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzKSwgZnVuY3Rpb24obil7IGV4cGVjdGVkX2Rpc3RyaWJ1dGlvbihuLCBvbWVnYSwgQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuaz09InNwZWNpZXMiLF0kc3RyYXRpZ3JhcGhpY19yYW5nZV9kdXJhdGlvbikkdmFsdWUgfSkKYWNjZXB0ZWRfbmFtZV9jb3VudF9jYXRlZ29yaWVzIDwtIHRhYmxlKGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llcykvYXMubnVtZXJpYyhuYW1lcyh0YWJsZShhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXMpKSkgICMgTnVtYmVyIG9mIGNhdGVnb3JpZXMgd2l0aCAxLCAyLCAzLCAuLi4gb2NjdXJyZW5jZXMgb2YgdGhlIHNhbWUgc3BlY2llcwoKIyBDb21wYXJlIHRoZSBpbml0aWFsIG9ic2VydmVkIGRpc3RyaWJ1dGlvbiB3aXRoIHRoZSB0aGVvcmV0aWNhbCBjdXJ2ZQpnZ3Bsb3QoQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuaz09InNwZWNpZXMiLF0sIAogICAgICAgYWVzKHg9YWNjZXB0ZWRfbmFtZV9jb3VudCwgCiAgICAgICAgICAgeT1hY2NlcHRlZF9uYW1lX2NvdW50X2NhdGVnb3JpZXNbYXMuZmFjdG9yKGFjY2VwdGVkX25hbWVfY291bnQpXSwgCiAgICAgICAgICAgZmlsbD1hY2NlcHRlZF9yYW5rKSkgKwogIGdlb21fcG9pbnQoKSArCiAgCiAgYW5ub3RhdGUoImxpbmUiLCB4ID0gMTptYXgoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzKSwgeT0gZGVucwogICAgKm1heCgodGFibGUoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzKS9hcy5udW1lcmljKG5hbWVzKHRhYmxlKGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llcykpKSlbYXMuZmFjdG9yKGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llcyldKSAvbWF4KGRlbnMpKSsKICAKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJOdW1iZXIgb2Ygb2NjdXJyZW5jZXMgYnkgYWNjZXB0ZWQgbmFtZSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiLCBuYW1lID0gIk51bWJlciBvZiBjb3JyZXNwb25kaW5nIGFjY2VwdGVkIG5hbWVzIChsb2ctc2NhbGUpIikgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZT0iT2JzZXJ2ZWQgZGlzdHJpYnV0aW9uIikgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpKSArCiAgZ2d0aXRsZSgiQ29tcGFyaXNvbiBiZXR3ZWVuIGV4cGVjdGVkIGFuZCBvYnNlcnZlZCBkaXN0cmlidXRpb25zIG9mIG51bWJlciBvZiBvY2N1cnJlbmNlcyIpICsKICBmYWNldF9ncmlkKGFjY2VwdGVkX3JhbmsgfiAuLCBzY2FsZXMgPSAiZnJlZSIpCgphY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfYWdncmVnIDwtIENldGFjZWFfb2NjX2FnZ3JlZ1tDZXRhY2VhX29jY19hZ2dyZWckYWNjZXB0ZWRfcmFuaz09InNwZWNpZXMiLF0kYWNjZXB0ZWRfbmFtZV9jb3VudApkZW5zX2FnZ3JlZyA8LSBzYXBwbHkoMTptYXgoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzX2FnZ3JlZyksIGZ1bmN0aW9uKG4pewogICAgIGV4cGVjdGVkX2Rpc3RyaWJ1dGlvbihuLCBvbWVnYSwgQ2V0YWNlYV9vY2NfYWdncmVnW0NldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSRzdHJhdGlncmFwaGljX3JhbmdlX2R1cmF0aW9uKSR2YWx1ZQogICAgfSkKYWNjZXB0ZWRfbmFtZV9jb3VudF9jYXRlZ29yaWVzX2FnZ3JlZyA8LSB0YWJsZShhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfYWdncmVnKS9hcy5udW1lcmljKG5hbWVzKHRhYmxlKGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19hZ2dyZWcpKSkgICMgTnVtYmVyIG9mIGNhdGVnb3JpZXMgd2l0aCAxLCAyLCAzLCAuLi4gb2NjdXJyZW5jZXMgb2YgdGhlIHNhbWUgc3BlY2llcwoKIyBDb21wYXJlIHRoZSBjb3JyZWN0ZWQgb2JzZXJ2ZWQgZGlzdHJpYnV0aW9uIHdpdGggdGhlIHRoZW9yZXRpY2FsIGN1cnZlCmdncGxvdChDZXRhY2VhX29jY19hZ2dyZWdbQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX3Jhbms9PSJzcGVjaWVzIixdLCAKICAgICAgIGFlcyh4PWFjY2VwdGVkX25hbWVfY291bnQsCiAgICAgICAgICAgeT1hY2NlcHRlZF9uYW1lX2NvdW50X2NhdGVnb3JpZXNfYWdncmVnW2FzLmZhY3RvcihhY2NlcHRlZF9uYW1lX2NvdW50KV0sIAogICAgICAgICAgIGZpbGw9YWNjZXB0ZWRfcmFuaykpICsKICBnZW9tX3BvaW50KCkgKwogIAogIGFubm90YXRlKCJsaW5lIiwgeCA9IDE6bWF4KGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19hZ2dyZWcpLCB5PSBkZW5zX2FnZ3JlZwogICAgKm1heCgodGFibGUoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzX2FnZ3JlZykvYXMubnVtZXJpYyhuYW1lcyh0YWJsZShhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfYWdncmVnKSkpKVthcy5mYWN0b3IoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzX2FnZ3JlZyldKSAvbWF4KGRlbnNfYWdncmVnKSkgKwogIAogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIk51bWJlciBvZiBvY2N1cnJlbmNlcyBieSBhY2NlcHRlZCBuYW1lIikgKwogIHNjYWxlX3lfY29udGludW91cyh0cmFucyA9ICJsb2cxMCIsIG5hbWUgPSAiTnVtYmVyIG9mIGNvcnJlc3BvbmRpbmcgYWNjZXB0ZWQgbmFtZXMgKGxvZy1zY2FsZSkiKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJPYnNlcnZlZCBkaXN0cmlidXRpb24iKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKICBnZ3RpdGxlKCJDb21wYXJpc29uIGJldHdlZW4gZXhwZWN0ZWQgYW5kIG9ic2VydmVkIGRpc3RyaWJ1dGlvbnMgb2YgbnVtYmVyIG9mIG9jY3VycmVuY2VzLCBhZnRlciBhZ2dyZWdhdGluZyBpbiBmb3JtYXRpb25zIikgKwogIGZhY2V0X2dyaWQoYWNjZXB0ZWRfcmFuayB+IC4sIHNjYWxlcyA9ICJmcmVlIikKCmFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19hZ2dyZWcgPC0gQ2V0YWNlYV9vY2NfYWdncmVnW0NldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSRhY2NlcHRlZF9uYW1lX2NvdW50CmRlbnNfYWdncmVnIDwtIHNhcHBseSgxOm1heChhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfYWdncmVnKSwgZnVuY3Rpb24obil7CiAgICAgZXhwZWN0ZWRfZGlzdHJpYnV0aW9uKG4sIG9tZWdhLCBDZXRhY2VhX29jY19hZ2dyZWdbQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX3Jhbms9PSJzcGVjaWVzIixdJHN0cmF0aWdyYXBoaWNfcmFuZ2VfZHVyYXRpb24pJHZhbHVlCiAgICB9KQphY2NlcHRlZF9uYW1lX2NvdW50X2NhdGVnb3JpZXNfYWdncmVnIDwtIHRhYmxlKGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19hZ2dyZWcpL2FzLm51bWVyaWMobmFtZXModGFibGUoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzX2FnZ3JlZykpKSAgIyBOdW1iZXIgb2YgY2F0ZWdvcmllcyB3aXRoIDEsIDIsIDMsIC4uLiBvY2N1cnJlbmNlcyBvZiB0aGUgc2FtZSBzcGVjaWVzCmBgYAoKJFx0byQgVGhlIGluaXRpYWwgYmlhcyBpcyBtb3N0bHkgY29ycmVjdGVkLgoKYGBge3IgZmlnLndpZHRoPTEwLCBmaWcuYXNwPTAuNSwgbWVzc2FnZT1GfQpjb25kaXRpb25zIDwtIENldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIKCnAxIDwtIGdncGxvdChDZXRhY2VhX29jY1tjb25kaXRpb25zLF0sIGFlcyh4PS1hZ2VfcnVuaWYpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjUsIGFscGhhPTAuNSwgZmlsbD1OQSwgY29sPSJyZWQiKSArCiAgeGxpbSgtbWF4KENldGFjZWFfb2NjW2NvbmRpdGlvbnMsXSRhZ2VfcnVuaWYpLTEsIDEpICsKICB5bGltKDAsIDcwKSArCiAgdGhlbWVfdm9pZCgpCgpwMiA8LSBnZ3Bsb3QoQ2V0YWNlYV9vY2Nfc2FtcGxlZCwgYWVzKHg9LWFnZV9ydW5pZikpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDAuNSwgYWxwaGE9MC41LCBmaWxsPSJibHVlIikgKwogIHhsaW0oLW1heChDZXRhY2VhX29jY1tjb25kaXRpb25zLF0kYWdlX3J1bmlmKS0xLCAxKSArCiAgeWxpbSgwLCA3MCkgKwogIHRoZW1lX3ZvaWQoKQoKcDMgPC0gZ2dwbG90KENldGFjZWFfb2NjX2FnZ3JlZ1tDZXRhY2VhX29jY19hZ2dyZWckYWNjZXB0ZWRfcmFuayA9PSJzcGVjaWVzIixdLCBhZXMoeD0tYWdlX3J1bmlmKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMC41LCBhbHBoYT0wLjUsIGZpbGw9ImdyZWVuIikgKwogIHhsaW0oLW1heChDZXRhY2VhX29jY1tjb25kaXRpb25zLF0kYWdlX3J1bmlmKS0xLCAxKSArCiAgeWxpbSgwLCA3MCkgKwogIHRoZW1lX3ZvaWQoKQoKIyBwMSArIGFubm90YXRpb25fY3VzdG9tKGdncGxvdEdyb2IocDIpKSArIGdndGl0bGUoIkluaXRpYWwgb2NjdXJyZW5jZXMgZGlzdHJpYnV0aW9uIChyZWQpIGFuZCBjb21wYXJpc29uIGFmdGVyIHN1Yi1zYW1wbGluZyAoYmx1ZSkiKQojIAojIHAxICsgYW5ub3RhdGlvbl9jdXN0b20oZ2dwbG90R3JvYihwMykpICsgZ2d0aXRsZSgiSW5pdGlhbCBvY2N1cnJlbmNlcyBkaXN0cmlidXRpb24gKHJlZCkgYW5kIGNvbXBhcmlzb24gYWZ0ZXIgYWdncmVnYXRpbmcgaW4gZm9ybWF0aW9ucyAoZ3JlZW4pIikKCnAxICsgYW5ub3RhdGlvbl9jdXN0b20oZ2dwbG90R3JvYihwMikpICsgYW5ub3RhdGlvbl9jdXN0b20oZ2dwbG90R3JvYihwMykpICsgZ2d0aXRsZSgiSW5pdGlhbCBvY2N1cnJlbmNlcyBkaXN0cmlidXRpb24gKHJlZCkgYW5kIGNvbXBhcmlzb24gYWZ0ZXIgc3ViLXNhbXBsaW5nIChibHVlKSBvciBhZ2dyZWdhdGluZyBpbiBmb3JtYXRpb25zIChncmVlbikiKQpgYGAKCiRcdG8kIENvbXBhcmluZyB3aXRoIHRoZSBpbml0aWFsIG9jY3VycmVuY2VzIGRpc3RyaWJ1dGlvbiBhbmQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uIGFmdGVyIG91ciBmaXJzdCBzdWItc2FtcGxpbmcgaXQgYXBwZWFycyB0aGF0IGJvdGggbWV0aG9kcyBsZWFkIHRvIHZlcnkgc2ltaWxhciBkaXN0cmlidXRpb25zLiBUaGlzIGNvbWZvcnRzIHVzIGFib3V0IHRoZSByb2J1c3RuZXNzIG9mIHRob3NlIGFwcHJvYWNoZXMuCgpIb3dldmVyLCB3ZSBoYXZlIHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBvY2N1cnJlbmNlcyB0aGF0IGRvIG5vdCBoYXZlIGFueSBpbmRpY2F0ZWQgZ2VvbG9naWNhbCBmb3JtYXRpb24gdG8gc3Vic2FtcGxlIHRoZW0gc2VwYXJhdGVseS4KCiMjIFdyb25nIHRyYWNrOiBBZ2dyZWdhdGUgb2NjdXJyZW5jZXMgd2l0aG91dCBmb3JtYXRpb24gYnkgY291bnRyeSArIGVhcmx5IGludGVydmFsCgpUbyBhcHByb3hpbWF0ZSBnZW9sb2dpY2FsIGZvcm1hdGlvbiB3ZSBjaG9zZSB0byBwcm9jZWVkIHRvIHRoZSBhZ2dyZWdhdGlvbiBiYXNlZCBvbiB0aGUgY29tYmluYXRpb24gb2YgdGhlIGNvdW50cnkgYW5kIHRoZSBlYXJseSBzdHJhdGlncmFwaGljIGludGVydmFsLgoKYGBge3J9CkNldGFjZWFfb2NjX2FnZ3JlZyA8LSBjKCkKCiMgQnJvd3NlIGFsbCBjb3VudHJpZXMKY291bnRyaWVzIDwtIGxldmVscyhkcm9wbGV2ZWxzKENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGZvcm1hdGlvbj09IiIsXSRjYykpCmZvciAoY291bnRyeSBpbiBjb3VudHJpZXMpewogIENldGFjZWFfb2NjX2NjIDwtIENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGZvcm1hdGlvbj09IiIgJiBDZXRhY2VhX29jYyRjYz09Y291bnRyeSxdCiAgCiAgIyBCcm93c2UgYWxsIGVhcmx5IHN0cmF0aWdyYXBoaWMgaW50ZXJ2YWxzCiAgZWFybHlfaW50ZXJ2YWxzIDwtIGxldmVscyhkcm9wbGV2ZWxzKENldGFjZWFfb2NjX2NjJGVhcmx5X2ludGVydmFsKSkKICBmb3IgKGVpIGluIGVhcmx5X2ludGVydmFscyl7CiAgICBDZXRhY2VhX29jY19jY19laSA8LSBDZXRhY2VhX29jY19jY1tDZXRhY2VhX29jY19jYyRlYXJseV9pbnRlcnZhbD09ZWksXQogICAgCiAgICAjIEJyb3dzZSBhbGwgYWNjZXB0ZWQgbmFtZXMgaW4gZWFjaCBjb3VudHJ5ICYgc2FtcGxlIG9ubHkgMSBvY2N1cnJlbmNlCiAgICB0YXhhIDwtIGxldmVscyhkcm9wbGV2ZWxzKENldGFjZWFfb2NjX2NjX2VpJGFjY2VwdGVkX25hbWUpKQogICAgZm9yIChuYW1lIGluIHRheGEpewogICAgICBDZXRhY2VhX29jY19hZ2dyZWcgPC0gcmJpbmQoQ2V0YWNlYV9vY2NfYWdncmVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlX24oQ2V0YWNlYV9vY2NfY2NfZWlbQ2V0YWNlYV9vY2NfY2NfZWkkYWNjZXB0ZWRfbmFtZT09bmFtZSxdLCBzaXplID0gMSkpCiAgICB9CiAgfQp9CgojIEJyb3dzZSBhbGwgZm9ybWF0aW9ucwpmb3JtYXRpb25zIDwtIGxldmVscyhkcm9wbGV2ZWxzKENldGFjZWFfb2NjJGZvcm1hdGlvbikpCmZvciAoZm9ybSBpbiBmb3JtYXRpb25zWy13aGljaChmb3JtYXRpb25zPT0iIildKXsKICBDZXRhY2VhX29jY19mb3JtIDwtIENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGZvcm1hdGlvbj09Zm9ybSxdCiAgCiAgIyBCcm93c2UgYWxsIGFjY2VwdGVkIG5hbWVzIGluIGVhY2ggZm9ybWF0aW9uICYgc2FtcGxlIG9ubHkgMSBvY2N1cnJlbmNlCiAgdGF4YSA8LSBsZXZlbHMoZHJvcGxldmVscyhDZXRhY2VhX29jY19mb3JtJGFjY2VwdGVkX25hbWUpKQogIGZvciAobmFtZSBpbiB0YXhhKXsKICAgIENldGFjZWFfb2NjX2FnZ3JlZyA8LSByYmluZChDZXRhY2VhX29jY19hZ2dyZWcsIHNhbXBsZV9uKENldGFjZWFfb2NjX2Zvcm1bQ2V0YWNlYV9vY2NfZm9ybSRhY2NlcHRlZF9uYW1lPT1uYW1lLF0sIHNpemUgPSAxKSkKICB9Cn0KCmRhdGEuZnJhbWUoQ2V0YWNlYV9vY2MgPSBjKGRpbShDZXRhY2VhX29jYylbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbShDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rID09InNwZWNpZXMiLF0pWzFdKSwKICAgICAgICAgICBDZXRhY2VhX29jY19hZ2dyZWcgPSBjKGRpbShDZXRhY2VhX29jY19hZ2dyZWcpWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltKENldGFjZWFfb2NjX2FnZ3JlZ1tDZXRhY2VhX29jY19hZ2dyZWckYWNjZXB0ZWRfcmFuayA9PSJzcGVjaWVzIixdKVsxXSksCiAgICAgICAgICAgcmVtb3ZlZCA9IGMoZGltKENldGFjZWFfb2NjKVsxXS1kaW0oQ2V0YWNlYV9vY2NfYWdncmVnKVsxXSwKICAgICAgICAgICAgICAgICAgICAgICBkaW0oQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuayA9PSJzcGVjaWVzIixdKVsxXS1kaW0oQ2V0YWNlYV9vY2NfYWdncmVnW0NldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9yYW5rID09InNwZWNpZXMiLF0pWzFdKSwKICAgICAgICAgICByb3cubmFtZXMgPSBjKCJOdW1iZXIgb2Ygb2NjdXJyZW5jZXMiLCAiTnVtYmVyIG9mIG9jY3VycmVuY2VzIChzcGVjaWVzIG9ubHkpIikpCmBgYAoKTW9yZSBvY2N1cnJlbmNlcyByZW1haW4gYWZ0ZXIgYWdncmVnYXRpbmcgd2l0aCB0aGlzIG5ldyBtZXRob2QuIExldCdzIGNvbXBhcmUgYWdhaW4gd2l0aCB0aGUgdGhlb3JldGljYWwgZGlzdHJpYnV0aW9uOgoKYGBge3IgZmlnLndpZHRoPTEwLCBmaWcuYXNwPTAuNH0KIyBSZWNvdW50IHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgd2l0aCB0aGUgc2FtZSBhY2NlcHRlZCBuYW1lIGFmdGVyIHRoZSBhZ2dyZWdhdGlvbgpDZXRhY2VhX29jY19hZ2dyZWckYWNjZXB0ZWRfbmFtZV9jb3VudCA8LSBzYXBwbHkoQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX25hbWUsIGZ1bmN0aW9uKHgpe3RhYmxlKENldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9uYW1lKVt4XX0pCgpvbWVnYSA8LSAwLjE1CmFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llcyA8LSBDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSRhY2NlcHRlZF9uYW1lX2NvdW50CmRlbnMgPC0gc2FwcGx5KDE6bWF4KGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llcyksIGZ1bmN0aW9uKG4peyBleHBlY3RlZF9kaXN0cmlidXRpb24obiwgb21lZ2EsIENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3Jhbms9PSJzcGVjaWVzIixdJHN0cmF0aWdyYXBoaWNfcmFuZ2VfZHVyYXRpb24pJHZhbHVlIH0pCmFjY2VwdGVkX25hbWVfY291bnRfY2F0ZWdvcmllcyA8LSB0YWJsZShhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXMpL2FzLm51bWVyaWMobmFtZXModGFibGUoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzKSkpICAjIE51bWJlciBvZiBjYXRlZ29yaWVzIHdpdGggMSwgMiwgMywgLi4uIG9jY3VycmVuY2VzIG9mIHRoZSBzYW1lIHNwZWNpZXMKCiMgQ29tcGFyZSB0aGUgaW5pdGlhbCBvYnNlcnZlZCBkaXN0cmlidXRpb24gd2l0aCB0aGUgdGhlb3JldGljYWwgY3VydmUKZ2dwbG90KENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3Jhbms9PSJzcGVjaWVzIixdLCAKICAgICAgIGFlcyh4PWFjY2VwdGVkX25hbWVfY291bnQsIAogICAgICAgICAgIHk9YWNjZXB0ZWRfbmFtZV9jb3VudF9jYXRlZ29yaWVzW2FzLmZhY3RvcihhY2NlcHRlZF9uYW1lX2NvdW50KV0sIAogICAgICAgICAgIGZpbGw9YWNjZXB0ZWRfcmFuaykpICsKICBnZW9tX3BvaW50KCkgKwogIAogIGFubm90YXRlKCJsaW5lIiwgeCA9IDE6bWF4KGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llcyksIHk9IGRlbnMKICAgICptYXgoKHRhYmxlKGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llcykvYXMubnVtZXJpYyhuYW1lcyh0YWJsZShhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXMpKSkpW2FzLmZhY3RvcihhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXMpXSkgL21heChkZW5zKSkrCiAgCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiTnVtYmVyIG9mIG9jY3VycmVuY2VzIGJ5IGFjY2VwdGVkIG5hbWUiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zID0gImxvZzEwIiwgbmFtZSA9ICJOdW1iZXIgb2YgY29ycmVzcG9uZGluZyBhY2NlcHRlZCBuYW1lcyAobG9nLXNjYWxlKSIpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWU9Ik9ic2VydmVkIGRpc3RyaWJ1dGlvbiIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGdndGl0bGUoIkNvbXBhcmlzb24gYmV0d2VlbiBleHBlY3RlZCBhbmQgb2JzZXJ2ZWQgZGlzdHJpYnV0aW9ucyBvZiBudW1iZXIgb2Ygb2NjdXJyZW5jZXMiKSArCiAgZmFjZXRfZ3JpZChhY2NlcHRlZF9yYW5rIH4gLiwgc2NhbGVzID0gImZyZWUiKQoKYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzX2FnZ3JlZyA8LSBDZXRhY2VhX29jY19hZ2dyZWdbQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX3Jhbms9PSJzcGVjaWVzIixdJGFjY2VwdGVkX25hbWVfY291bnQKZGVuc19hZ2dyZWcgPC0gc2FwcGx5KDE6bWF4KGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19hZ2dyZWcpLCBmdW5jdGlvbihuKXsKICAgICBleHBlY3RlZF9kaXN0cmlidXRpb24obiwgb21lZ2EsIENldGFjZWFfb2NjX2FnZ3JlZ1tDZXRhY2VhX29jY19hZ2dyZWckYWNjZXB0ZWRfcmFuaz09InNwZWNpZXMiLF0kc3RyYXRpZ3JhcGhpY19yYW5nZV9kdXJhdGlvbikkdmFsdWUKICAgIH0pCmFjY2VwdGVkX25hbWVfY291bnRfY2F0ZWdvcmllc19hZ2dyZWcgPC0gdGFibGUoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzX2FnZ3JlZykvYXMubnVtZXJpYyhuYW1lcyh0YWJsZShhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfYWdncmVnKSkpICAjIE51bWJlciBvZiBjYXRlZ29yaWVzIHdpdGggMSwgMiwgMywgLi4uIG9jY3VycmVuY2VzIG9mIHRoZSBzYW1lIHNwZWNpZXMKCiMgQ29tcGFyZSB0aGUgY29ycmVjdGVkIG9ic2VydmVkIGRpc3RyaWJ1dGlvbiB3aXRoIHRoZSB0aGVvcmV0aWNhbCBjdXJ2ZQpnZ3Bsb3QoQ2V0YWNlYV9vY2NfYWdncmVnW0NldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSwgCiAgICAgICBhZXMoeD1hY2NlcHRlZF9uYW1lX2NvdW50LAogICAgICAgICAgIHk9YWNjZXB0ZWRfbmFtZV9jb3VudF9jYXRlZ29yaWVzX2FnZ3JlZ1thcy5mYWN0b3IoYWNjZXB0ZWRfbmFtZV9jb3VudCldLCAKICAgICAgICAgICBmaWxsPWFjY2VwdGVkX3JhbmspKSArCiAgZ2VvbV9wb2ludCgpICsKICAKICBhbm5vdGF0ZSgibGluZSIsIHggPSAxOm1heChhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfYWdncmVnKSwgeT0gZGVuc19hZ2dyZWcKICAgICptYXgoKHRhYmxlKGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19hZ2dyZWcpL2FzLm51bWVyaWMobmFtZXModGFibGUoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzX2FnZ3JlZykpKSlbYXMuZmFjdG9yKGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19hZ2dyZWcpXSkgL21heChkZW5zX2FnZ3JlZykpICsKICAKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJOdW1iZXIgb2Ygb2NjdXJyZW5jZXMgYnkgYWNjZXB0ZWQgbmFtZSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiLCBuYW1lID0gIk51bWJlciBvZiBjb3JyZXNwb25kaW5nIGFjY2VwdGVkIG5hbWVzIChsb2ctc2NhbGUpIikgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZT0iT2JzZXJ2ZWQgZGlzdHJpYnV0aW9uIikgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpKSArCiAgZ2d0aXRsZSgiQ29tcGFyaXNvbiBiZXR3ZWVuIGV4cGVjdGVkIGFuZCBvYnNlcnZlZCBkaXN0cmlidXRpb25zIG9mIG51bWJlciBvZiBvY2N1cnJlbmNlcywgYWZ0ZXIgYWdncmVnYXRpbmcgaW4gZm9ybWF0aW9ucyIpICsKICBmYWNldF9ncmlkKGFjY2VwdGVkX3JhbmsgfiAuLCBzY2FsZXMgPSAiZnJlZSIpCgphY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfYWdncmVnIDwtIENldGFjZWFfb2NjX2FnZ3JlZ1tDZXRhY2VhX29jY19hZ2dyZWckYWNjZXB0ZWRfcmFuaz09InNwZWNpZXMiLF0kYWNjZXB0ZWRfbmFtZV9jb3VudApkZW5zX2FnZ3JlZyA8LSBzYXBwbHkoMTptYXgoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzX2FnZ3JlZyksIGZ1bmN0aW9uKG4pewogICAgIGV4cGVjdGVkX2Rpc3RyaWJ1dGlvbihuLCBvbWVnYSwgQ2V0YWNlYV9vY2NfYWdncmVnW0NldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSRzdHJhdGlncmFwaGljX3JhbmdlX2R1cmF0aW9uKSR2YWx1ZQogICAgfSkKYWNjZXB0ZWRfbmFtZV9jb3VudF9jYXRlZ29yaWVzX2FnZ3JlZyA8LSB0YWJsZShhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfYWdncmVnKS9hcy5udW1lcmljKG5hbWVzKHRhYmxlKGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19hZ2dyZWcpKSkgICMgTnVtYmVyIG9mIGNhdGVnb3JpZXMgd2l0aCAxLCAyLCAzLCAuLi4gb2NjdXJyZW5jZXMgb2YgdGhlIHNhbWUgc3BlY2llcwpgYGAKCiRcdG8kIFRoZSBjb3JyZXNwb25kZW5jZSBpcyBzdGlsbCBnb29kLCBleGNlcHQgZm9yIHR3byB0YXhhOgoKYGBge3J9CnRhYmxlKGRyb3BsZXZlbHMoQ2V0YWNlYV9vY2NfYWdncmVnW0NldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXVthY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfYWdncmVnPjEwLF0kYWNjZXB0ZWRfbmFtZSkpCmBgYAoKYGBge3IsIHdhcm5pbmc9RkFMU0V9CkNldGFjZWFfb2NjX2FnZ3JlZyRhZ2VfdW5jZXJ0YWludHkgPC0gQ2V0YWNlYV9vY2NfYWdncmVnJG1heF9tYS1DZXRhY2VhX29jY19hZ2dyZWckbWluX21hCkNldGFjZWFfb2NjX2FnZ3JlZyRtaW5fbWluX21hIDwtIGFwcGx5KENldGFjZWFfb2NjX2FnZ3JlZywgMSwgZnVuY3Rpb24oWCl7bWluKENldGFjZWFfb2NjX2FnZ3JlZ1tDZXRhY2VhX29jY19hZ2dyZWckYWdlX3VuY2VydGFpbnR5PDEwICYgQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX25hbWU9PVhbImFjY2VwdGVkX25hbWUiXSxdJG1pbl9tYSl9KQpDZXRhY2VhX29jY19hZ2dyZWckbWF4X21heF9tYSA8LSBhcHBseShDZXRhY2VhX29jY19hZ2dyZWcsIDEsIGZ1bmN0aW9uKFgpe21heChDZXRhY2VhX29jY19hZ2dyZWdbQ2V0YWNlYV9vY2NfYWdncmVnJGFnZV91bmNlcnRhaW50eTwxMCAmIENldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9uYW1lPT1YWyJhY2NlcHRlZF9uYW1lIl0sXSRtYXhfbWEpfSkKQ2V0YWNlYV9vY2NfYWdncmVnJHN0cmF0aWdyYXBoaWNfcmFuZ2VfbWlkcG9pbnQgPC0gKENldGFjZWFfb2NjX2FnZ3JlZyRtaW5fbWluX21hICsgQ2V0YWNlYV9vY2NfYWdncmVnJG1heF9tYXhfbWEpLzIKQ2V0YWNlYV9vY2NfYWdncmVnJHN0cmF0aWdyYXBoaWNfcmFuZ2VfZHVyYXRpb24gPC0gQ2V0YWNlYV9vY2NfYWdncmVnJG1heF9tYXhfbWEtQ2V0YWNlYV9vY2NfYWdncmVnJG1pbl9taW5fbWEKQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX25hbWVfY291bnQgPC0gc2FwcGx5KENldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9uYW1lLCBmdW5jdGlvbih4KXt0YWJsZShDZXRhY2VhX29jY19hZ2dyZWckYWNjZXB0ZWRfbmFtZSlbeF19KQpDZXRhY2VhX29jY19hZ2dyZWckb2NjdXJyZW5jZV9jb21iaW5lZF9kZW5zaXR5IDwtIENldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9uYW1lX2NvdW50L0NldGFjZWFfb2NjX2FnZ3JlZyRzdHJhdGlncmFwaGljX3JhbmdlX2R1cmF0aW9uCmBgYAoKYGBge3IgZmlnLmFzcD0wLjUsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRX0KYnJlYWtzIDwtIGMoMC4xMjUsMC4yNSwwLjUsMSwyLDQsOCwxNikKCnBfYmVmb3JlIDwtIGdncGxvdChDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rID09InNwZWNpZXMiICYgQ2V0YWNlYV9vY2MkYWdlX3VuY2VydGFpbnR5PDEwLF0sIGFlcyh4PS1tYXhfbWEsIHk9YWNjZXB0ZWRfbmFtZSkpICsKICBnZW9tX3NlZ21lbnQoYWVzKHggPSAtbWF4X21heF9tYSwgeSA9IHJlb3JkZXIoYWNjZXB0ZWRfbmFtZSwgLXN0cmF0aWdyYXBoaWNfcmFuZ2VfbWlkcG9pbnQpLCB4ZW5kID0gLW1pbl9taW5fbWEsIHllbmQ9cmVvcmRlcihhY2NlcHRlZF9uYW1lLCAtc3RyYXRpZ3JhcGhpY19yYW5nZV9taWRwb2ludCksIGNvbG9yPW9jY3VycmVuY2VfY29tYmluZWRfZGVuc2l0eSksIGFycm93PWFycm93KGVuZHMgPSAiYm90aCIsIGFuZ2xlPTkwLCBsZW5ndGggPSB1bml0KDEsICJtbSIpKSwgYWxwaGE9MC41KSArCiAgZ2VvbV9wb2ludChhZXMoeD0tYWdlX3J1bmlmKSwgY29sPSJyZWQiLCBjZXg9MC41LCBhbHBoYT0wLjUpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiAgc2NhbGVfeV9kaXNjcmV0ZShuYW1lID0gIlNwZWNpZXMiKSArCiAgbGFicyhjb2xvdXI9Ik9jY3VycmVuY2VcbmRlbnNpdHkiKSArCiAgdGhlbWUoYXhpcy50ZXh0Lnk9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueT1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3IgPSBOQSksCiAgICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG9yID0gTkEpLAogICAgICAgIGxlZ2VuZC5ib3guYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3IgPSBOQSkpICsKICBzY2FsZV9jb2xvcl9ncmFkaWVudG4oY29sb3VycyA9IGMoImRhcmtibHVlIiwgImZvcmVzdGdyZWVuIiwgImJsYWNrIiksIHRyYW5zPSJsb2ciLCBicmVha3M9YnJlYWtzLCBsYWJlbHM9YnJlYWtzKSArIAogIGdndGl0bGUocGFzdGUoIkRpc3RyaWJ1dGlvbnMgb2Ygc3BlY2llcyBmb3NzaWwgYWdlIHVuY2VydGFpbnRpZXMsIGJlZm9yZSBzdWJzYW1wbGluZyAobiA9ICIsIGRpbShDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rID09InNwZWNpZXMiICYgQ2V0YWNlYV9vY2MkYWdlX3VuY2VydGFpbnR5PDEwLF0pWzFdLCAiKSIsIHNlcD0iIikpCnBfYmVmb3JlCgpnZ3NhdmUoIi4uL0ltYWdlcy9SYW5nZV9kaXN0cmlidXRpb25zX2JlZm9yZV9hZ2dyZWdhdGluZy5zdmciLCBwbG90ID0gcF9iZWZvcmUsIGRldmljZSA9ICJzdmciLCBiZyA9ICJ0cmFuc3BhcmVudCIpCgpwX2FmdGVyIDwtIGdncGxvdChDZXRhY2VhX29jY19hZ2dyZWdbQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIgJiBDZXRhY2VhX29jY19hZ2dyZWckYWdlX3VuY2VydGFpbnR5PDEwLF0sIGFlcyh4PS1tYXhfbWEsIHk9YWNjZXB0ZWRfbmFtZSkpICsKICBnZW9tX3NlZ21lbnQoYWVzKHggPSAtbWF4X21heF9tYSwgeSA9IHJlb3JkZXIoYWNjZXB0ZWRfbmFtZSwgLXN0cmF0aWdyYXBoaWNfcmFuZ2VfbWlkcG9pbnQpLCB4ZW5kID0gLW1pbl9taW5fbWEsIHllbmQ9cmVvcmRlcihhY2NlcHRlZF9uYW1lLCAtc3RyYXRpZ3JhcGhpY19yYW5nZV9taWRwb2ludCksIGNvbG9yPW9jY3VycmVuY2VfY29tYmluZWRfZGVuc2l0eSksIGFycm93PWFycm93KGVuZHMgPSAiYm90aCIsIGFuZ2xlPTkwLCBsZW5ndGggPSB1bml0KDEsICJtbSIpKSwgYWxwaGE9MC41KSArCiAgZ2VvbV9wb2ludChhZXMoeD0tYWdlX3J1bmlmKSwgY29sPSJyZWQiLCBjZXg9MC41LCBhbHBoYT0wLjUpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiAgc2NhbGVfeV9kaXNjcmV0ZShuYW1lID0gIlNwZWNpZXMiKSArCiAgbGFicyhjb2xvdXI9Ik9jY3VycmVuY2VcbmRlbnNpdHkiKSArCiAgdGhlbWUoYXhpcy50ZXh0Lnk9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueT1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3IgPSBOQSksCiAgICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG9yID0gTkEpLAogICAgICAgIGxlZ2VuZC5ib3guYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3IgPSBOQSkpICsKICBzY2FsZV9jb2xvcl9ncmFkaWVudG4oY29sb3VycyA9IGMoImRhcmtibHVlIiwgImZvcmVzdGdyZWVuIiwgImJsYWNrIiksIHRyYW5zPSJsb2ciLCBicmVha3M9YnJlYWtzLCBsYWJlbHM9YnJlYWtzKSArIAogIGdndGl0bGUocGFzdGUoIkRpc3RyaWJ1dGlvbnMgb2Ygc3BlY2llcyBmb3NzaWwgYWdlIHVuY2VydGFpbnRpZXMsIGFmdGVyIHN1YnNhbXBsaW5nIGJ5IGFnZ3JlZ2F0aW9uIChuID0gIiwgZGltKENldGFjZWFfb2NjX3NhbXBsZWQpWzFdLCAiKSIsIHNlcD0iIikpCnBfYWZ0ZXIKCmdnc2F2ZSgiLi4vSW1hZ2VzL1JhbmdlX2Rpc3RyaWJ1dGlvbnNfYWZ0ZXJfYWdncmVnYXRpbmcuc3ZnIiwgcGxvdCA9IHBfYWZ0ZXIsIGRldmljZSA9ICJzdmciLCBiZyA9ICJ0cmFuc3BhcmVudCIpCmBgYAoKYGBge3IgZmlnLndpZHRoPTEwLCBmaWcuYXNwPTAuNX0KY29uZGl0aW9ucyA8LSBDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rID09InNwZWNpZXMiCgpwMSA8LSBnZ3Bsb3QoQ2V0YWNlYV9vY2NbY29uZGl0aW9ucyxdLCBhZXMoeD0tYWdlX3J1bmlmKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMC41LCBhbHBoYT0wLjUsIGZpbGw9TkEsIGNvbD0icmVkIikgKwogIHhsaW0oLW1heChDZXRhY2VhX29jY1tjb25kaXRpb25zLF0kYWdlX3J1bmlmKS0xLCAxKSArCiAgeWxpbSgwLCA3MCkgKwogIHRoZW1lX3ZvaWQoKQoKcDIgPC0gZ2dwbG90KENldGFjZWFfb2NjX3NhbXBsZWQsIGFlcyh4PS1hZ2VfcnVuaWYpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjUsIGFscGhhPTAuNSwgZmlsbD0iYmx1ZSIpICsKICB4bGltKC1tYXgoQ2V0YWNlYV9vY2NbY29uZGl0aW9ucyxdJGFnZV9ydW5pZiktMSwgMSkgKwogIHlsaW0oMCwgNzApICsKICB0aGVtZV92b2lkKCkKCnAzIDwtIGdncGxvdChDZXRhY2VhX29jY19hZ2dyZWdbQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIsXSwgYWVzKHg9LWFnZV9ydW5pZikpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDAuNSwgYWxwaGE9MC41LCBmaWxsPSJncmVlbiIpICsKICB4bGltKC1tYXgoQ2V0YWNlYV9vY2NbY29uZGl0aW9ucyxdJGFnZV9ydW5pZiktMSwgMSkgKwogIHlsaW0oMCwgNzApICsKICB0aGVtZV92b2lkKCkKCiMgcDEgKyBhbm5vdGF0aW9uX2N1c3RvbShnZ3Bsb3RHcm9iKHAyKSkgKyBnZ3RpdGxlKCJJbml0aWFsIG9jY3VycmVuY2VzIGRpc3RyaWJ1dGlvbiAocmVkKSBhbmQgY29tcGFyaXNvbiBhZnRlciBzdWItc2FtcGxpbmcgKGJsdWUpIikKIyAKIyBwMSArIGFubm90YXRpb25fY3VzdG9tKGdncGxvdEdyb2IocDMpKSArIGdndGl0bGUoIkluaXRpYWwgb2NjdXJyZW5jZXMgZGlzdHJpYnV0aW9uIChyZWQpIGFuZCBjb21wYXJpc29uIGFmdGVyIGFnZ3JlZ2F0aW5nIGluIGZvcm1hdGlvbnMgKGdyZWVuKSIpCgpwX2FsbCA8LSBwMSArIGFubm90YXRpb25fY3VzdG9tKGdncGxvdEdyb2IocDIpKSArIGFubm90YXRpb25fY3VzdG9tKGdncGxvdEdyb2IocDMpKSArIGdndGl0bGUoIkluaXRpYWwgb2NjdXJyZW5jZXMgZGlzdHJpYnV0aW9uIChyZWQpIGFuZCBjb21wYXJpc29uIGFmdGVyIHN1Yi1zYW1wbGluZyAoYmx1ZSkgb3IgYWdncmVnYXRpbmcgaW4gZm9ybWF0aW9ucyAoZ3JlZW4pIikgKyB0aGVtZShwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG9yID0gTkEpKQpwX2FsbAoKZ2dzYXZlKCIuLi9JbWFnZXMvT2NjdXJyZW5jZV9kaXN0cmlidXRpb25zX2NvbXBhcmlzb24uc3ZnIiwgcGxvdCA9IHBfYWxsLCBkZXZpY2UgPSAic3ZnIiwgYmcgPSAidHJhbnNwYXJlbnQiKQpgYGAKCiRcdG8kIENvbXBhcmluZyB3aXRoIHRoZSBpbml0aWFsIG9jY3VycmVuY2VzIGRpc3RyaWJ1dGlvbiBhbmQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uIGFmdGVyIG91ciBmaXJzdCBzdWItc2FtcGxpbmcgaXQgYXBwZWFycyB0aGF0IGJvdGggbWV0aG9kcyBsZWFkIHRvIHZlcnkgc2ltaWxhciBkaXN0cmlidXRpb25zLiBUaGlzIGNvbWZvcnRzIHVzIGFib3V0IHRoZSByb2J1c3RuZXNzIG9mIHRob3NlIGFwcHJvYWNoZXMuCgpSZXBsYWNpbmcgY291bnRyaWVzIGJ5IGdlb2xvZ2ljYWwgcGxhdGVzIHNlZW1zIHRvIG1ha2UgbW9yZSBzZW5zIGZyb20gYSBwYWxhZW9udG9sb2dpY2FsIHBlcnNwZWN0aXZlLCBzbyBsZXQncyB0cnkgaXQuCgojIyBBZ2dyZWdhdGUgb2NjdXJyZW5jZXMgd2l0aG91dCBmb3JtYXRpb24gYnkgZ2VvcGxhdGUgKyBlYXJseSBpbnRlcnZhbAoKYGBge3J9CkNldGFjZWFfb2NjX2FnZ3JlZyA8LSBjKCkKCiMgQnJvd3NlIGFsbCBnZW9wbGF0ZXMKZ2VvcGxhdGVzIDwtIGxldmVscyhkcm9wbGV2ZWxzKENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGZvcm1hdGlvbj09IiIsXSRnZW9wbGF0ZSkpCmZvciAoZ3AgaW4gZ2VvcGxhdGVzKXsKICBDZXRhY2VhX29jY19ncCA8LSBDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRmb3JtYXRpb249PSIiICYgQ2V0YWNlYV9vY2MkZ2VvcGxhdGU9PWdwLF0KICAKICAjIEJyb3dzZSBhbGwgZWFybHkgc3RyYXRpZ3JhcGhpYyBpbnRlcnZhbHMKICBlYXJseV9pbnRlcnZhbHMgPC0gbGV2ZWxzKGRyb3BsZXZlbHMoQ2V0YWNlYV9vY2NfZ3AkZWFybHlfaW50ZXJ2YWwpKQogIGZvciAoZWkgaW4gZWFybHlfaW50ZXJ2YWxzKXsKICAgIENldGFjZWFfb2NjX2dwX2VpIDwtIENldGFjZWFfb2NjX2dwW0NldGFjZWFfb2NjX2dwJGVhcmx5X2ludGVydmFsPT1laSxdCiAgICAKICAgICMgQnJvd3NlIGFsbCBhY2NlcHRlZCBuYW1lcyAmIHNhbXBsZSBvbmx5IDEgb2NjdXJyZW5jZQogICAgdGF4YSA8LSBsZXZlbHMoZHJvcGxldmVscyhDZXRhY2VhX29jY19ncF9laSRhY2NlcHRlZF9uYW1lKSkKICAgIGZvciAobmFtZSBpbiB0YXhhKXsKICAgICAgQ2V0YWNlYV9vY2NfYWdncmVnIDwtIHJiaW5kKENldGFjZWFfb2NjX2FnZ3JlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZV9uKENldGFjZWFfb2NjX2dwX2VpW0NldGFjZWFfb2NjX2dwX2VpJGFjY2VwdGVkX25hbWU9PW5hbWUsXSwgc2l6ZSA9IDEpKQogICAgfQogIH0KfQoKIyBCcm93c2UgYWxsIGZvcm1hdGlvbnMKZm9ybWF0aW9ucyA8LSBsZXZlbHMoZHJvcGxldmVscyhDZXRhY2VhX29jYyRmb3JtYXRpb24pKQpmb3IgKGZvcm0gaW4gZm9ybWF0aW9uc1std2hpY2goZm9ybWF0aW9ucz09IiIpXSl7CiAgQ2V0YWNlYV9vY2NfZm9ybSA8LSBDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRmb3JtYXRpb249PWZvcm0sXQogIAogICMgQnJvd3NlIGFsbCBhY2NlcHRlZCBuYW1lcyBpbiBlYWNoIGZvcm1hdGlvbiAmIHNhbXBsZSBvbmx5IDEgb2NjdXJyZW5jZQogIHRheGEgPC0gbGV2ZWxzKGRyb3BsZXZlbHMoQ2V0YWNlYV9vY2NfZm9ybSRhY2NlcHRlZF9uYW1lKSkKICBmb3IgKG5hbWUgaW4gdGF4YSl7CiAgICBDZXRhY2VhX29jY19hZ2dyZWcgPC0gcmJpbmQoQ2V0YWNlYV9vY2NfYWdncmVnLCBzYW1wbGVfbihDZXRhY2VhX29jY19mb3JtW0NldGFjZWFfb2NjX2Zvcm0kYWNjZXB0ZWRfbmFtZT09bmFtZSxdLCBzaXplID0gMSkpCiAgfQp9CgpkYXRhLmZyYW1lKENldGFjZWFfb2NjID0gYyhkaW0oQ2V0YWNlYV9vY2MpWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkaW0oQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuayA9PSJzcGVjaWVzIixdKVsxXSksCiAgICAgICAgICAgQ2V0YWNlYV9vY2NfYWdncmVnID0gYyhkaW0oQ2V0YWNlYV9vY2NfYWdncmVnKVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbShDZXRhY2VhX29jY19hZ2dyZWdbQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIsXSlbMV0pLAogICAgICAgICAgIHJlbW92ZWQgPSBjKGRpbShDZXRhY2VhX29jYylbMV0tZGltKENldGFjZWFfb2NjX2FnZ3JlZylbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgZGltKENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIsXSlbMV0tZGltKENldGFjZWFfb2NjX2FnZ3JlZ1tDZXRhY2VhX29jY19hZ2dyZWckYWNjZXB0ZWRfcmFuayA9PSJzcGVjaWVzIixdKVsxXSksCiAgICAgICAgICAgcm93Lm5hbWVzID0gYygiTnVtYmVyIG9mIG9jY3VycmVuY2VzIiwgIk51bWJlciBvZiBvY2N1cnJlbmNlcyAoc3BlY2llcyBvbmx5KSIpKQpgYGAKCk1vcmUgb2NjdXJyZW5jZXMgcmVtYWluIGFmdGVyIGFnZ3JlZ2F0aW5nIHdpdGggdGhpcyBuZXcgbWV0aG9kLiBMZXQncyBjb21wYXJlIGFnYWluIHdpdGggdGhlIHRoZW9yZXRpY2FsIGRpc3RyaWJ1dGlvbjoKCmBgYHtyIGZpZy53aWR0aD0xMCwgZmlnLmFzcD0wLjR9CiMgUmVjb3VudCB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIHdpdGggdGhlIHNhbWUgYWNjZXB0ZWQgbmFtZSBhZnRlciB0aGUgYWdncmVnYXRpb24KQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX25hbWVfY291bnQgPC0gc2FwcGx5KENldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9uYW1lLCBmdW5jdGlvbih4KXt0YWJsZShDZXRhY2VhX29jY19hZ2dyZWckYWNjZXB0ZWRfbmFtZSlbeF19KQoKb21lZ2EgPC0gMC4xNQphY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXMgPC0gQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuaz09InNwZWNpZXMiLF0kYWNjZXB0ZWRfbmFtZV9jb3VudApkZW5zIDwtIHNhcHBseSgxOm1heChhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXMpLCBmdW5jdGlvbihuKXsgZXhwZWN0ZWRfZGlzdHJpYnV0aW9uKG4sIG9tZWdhLCBDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSRzdHJhdGlncmFwaGljX3JhbmdlX2R1cmF0aW9uKSR2YWx1ZSB9KQphY2NlcHRlZF9uYW1lX2NvdW50X2NhdGVnb3JpZXMgPC0gdGFibGUoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzKS9hcy5udW1lcmljKG5hbWVzKHRhYmxlKGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llcykpKSAgIyBOdW1iZXIgb2YgY2F0ZWdvcmllcyB3aXRoIDEsIDIsIDMsIC4uLiBvY2N1cnJlbmNlcyBvZiB0aGUgc2FtZSBzcGVjaWVzCgojIENvbXBhcmUgdGhlIGluaXRpYWwgb2JzZXJ2ZWQgZGlzdHJpYnV0aW9uIHdpdGggdGhlIHRoZW9yZXRpY2FsIGN1cnZlCmdncGxvdChDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSwgCiAgICAgICBhZXMoeD1hY2NlcHRlZF9uYW1lX2NvdW50LCAKICAgICAgICAgICB5PWFjY2VwdGVkX25hbWVfY291bnRfY2F0ZWdvcmllc1thcy5mYWN0b3IoYWNjZXB0ZWRfbmFtZV9jb3VudCldLCAKICAgICAgICAgICBmaWxsPWFjY2VwdGVkX3JhbmspKSArCiAgZ2VvbV9wb2ludCgpICsKICAKICBhbm5vdGF0ZSgibGluZSIsIHggPSAxOm1heChhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXMpLCB5PSBkZW5zCiAgICAqbWF4KCh0YWJsZShhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXMpL2FzLm51bWVyaWMobmFtZXModGFibGUoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzKSkpKVthcy5mYWN0b3IoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzKV0pIC9tYXgoZGVucykpKwogIAogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIk51bWJlciBvZiBvY2N1cnJlbmNlcyBieSBhY2NlcHRlZCBuYW1lIikgKwogIHNjYWxlX3lfY29udGludW91cyh0cmFucyA9ICJsb2cxMCIsIG5hbWUgPSAiTnVtYmVyIG9mIGNvcnJlc3BvbmRpbmcgYWNjZXB0ZWQgbmFtZXMgKGxvZy1zY2FsZSkiKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJPYnNlcnZlZCBkaXN0cmlidXRpb24iKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKICBnZ3RpdGxlKCJDb21wYXJpc29uIGJldHdlZW4gZXhwZWN0ZWQgYW5kIG9ic2VydmVkIGRpc3RyaWJ1dGlvbnMgb2YgbnVtYmVyIG9mIG9jY3VycmVuY2VzIikgKwogIGZhY2V0X2dyaWQoYWNjZXB0ZWRfcmFuayB+IC4sIHNjYWxlcyA9ICJmcmVlIikKCmFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19hZ2dyZWcgPC0gQ2V0YWNlYV9vY2NfYWdncmVnW0NldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSRhY2NlcHRlZF9uYW1lX2NvdW50CmRlbnNfYWdncmVnIDwtIHNhcHBseSgxOm1heChhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfYWdncmVnKSwgZnVuY3Rpb24obil7CiAgICAgZXhwZWN0ZWRfZGlzdHJpYnV0aW9uKG4sIG9tZWdhLCBDZXRhY2VhX29jY19hZ2dyZWdbQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX3Jhbms9PSJzcGVjaWVzIixdJHN0cmF0aWdyYXBoaWNfcmFuZ2VfZHVyYXRpb24pJHZhbHVlCiAgICB9KQphY2NlcHRlZF9uYW1lX2NvdW50X2NhdGVnb3JpZXNfYWdncmVnIDwtIHRhYmxlKGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19hZ2dyZWcpL2FzLm51bWVyaWMobmFtZXModGFibGUoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzX2FnZ3JlZykpKSAgIyBOdW1iZXIgb2YgY2F0ZWdvcmllcyB3aXRoIDEsIDIsIDMsIC4uLiBvY2N1cnJlbmNlcyBvZiB0aGUgc2FtZSBzcGVjaWVzCgojIENvbXBhcmUgdGhlIGNvcnJlY3RlZCBvYnNlcnZlZCBkaXN0cmlidXRpb24gd2l0aCB0aGUgdGhlb3JldGljYWwgY3VydmUKZ2dwbG90KENldGFjZWFfb2NjX2FnZ3JlZ1tDZXRhY2VhX29jY19hZ2dyZWckYWNjZXB0ZWRfcmFuaz09InNwZWNpZXMiLF0sIAogICAgICAgYWVzKHg9YWNjZXB0ZWRfbmFtZV9jb3VudCwKICAgICAgICAgICB5PWFjY2VwdGVkX25hbWVfY291bnRfY2F0ZWdvcmllc19hZ2dyZWdbYXMuZmFjdG9yKGFjY2VwdGVkX25hbWVfY291bnQpXSwgCiAgICAgICAgICAgZmlsbD1hY2NlcHRlZF9yYW5rKSkgKwogIGdlb21fcG9pbnQoKSArCiAgCiAgYW5ub3RhdGUoImxpbmUiLCB4ID0gMTptYXgoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzX2FnZ3JlZyksIHk9IGRlbnNfYWdncmVnCiAgICAqbWF4KCh0YWJsZShhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfYWdncmVnKS9hcy5udW1lcmljKG5hbWVzKHRhYmxlKGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19hZ2dyZWcpKSkpW2FzLmZhY3RvcihhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfYWdncmVnKV0pIC9tYXgoZGVuc19hZ2dyZWcpKSArCiAgCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiTnVtYmVyIG9mIG9jY3VycmVuY2VzIGJ5IGFjY2VwdGVkIG5hbWUiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zID0gImxvZzEwIiwgbmFtZSA9ICJOdW1iZXIgb2YgY29ycmVzcG9uZGluZyBhY2NlcHRlZCBuYW1lcyAobG9nLXNjYWxlKSIpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWU9Ik9ic2VydmVkIGRpc3RyaWJ1dGlvbiIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGdndGl0bGUoIkNvbXBhcmlzb24gYmV0d2VlbiBleHBlY3RlZCBhbmQgb2JzZXJ2ZWQgZGlzdHJpYnV0aW9ucyBvZiBudW1iZXIgb2Ygb2NjdXJyZW5jZXMsIGFmdGVyIGFnZ3JlZ2F0aW5nIGluIGdlb3BsYXRlcyIpICsKICBmYWNldF9ncmlkKGFjY2VwdGVkX3JhbmsgfiAuLCBzY2FsZXMgPSAiZnJlZSIpCgphY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfYWdncmVnIDwtIENldGFjZWFfb2NjX2FnZ3JlZ1tDZXRhY2VhX29jY19hZ2dyZWckYWNjZXB0ZWRfcmFuaz09InNwZWNpZXMiLF0kYWNjZXB0ZWRfbmFtZV9jb3VudApkZW5zX2FnZ3JlZyA8LSBzYXBwbHkoMTptYXgoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzX2FnZ3JlZyksIGZ1bmN0aW9uKG4pewogICAgIGV4cGVjdGVkX2Rpc3RyaWJ1dGlvbihuLCBvbWVnYSwgQ2V0YWNlYV9vY2NfYWdncmVnW0NldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSRzdHJhdGlncmFwaGljX3JhbmdlX2R1cmF0aW9uKSR2YWx1ZQogICAgfSkKYWNjZXB0ZWRfbmFtZV9jb3VudF9jYXRlZ29yaWVzX2FnZ3JlZyA8LSB0YWJsZShhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfYWdncmVnKS9hcy5udW1lcmljKG5hbWVzKHRhYmxlKGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19hZ2dyZWcpKSkgICMgTnVtYmVyIG9mIGNhdGVnb3JpZXMgd2l0aCAxLCAyLCAzLCAuLi4gb2NjdXJyZW5jZXMgb2YgdGhlIHNhbWUgc3BlY2llcwpgYGAKCiRcdG8kIFRoZSBjb3JyZXNwb25kZW5jZSBpcyBzdGlsbCBnb29kLCBleGNlcHQgZm9yIHR3byB0YXhhOgoKYGBge3J9CnRhYmxlKGRyb3BsZXZlbHMoQ2V0YWNlYV9vY2NfYWdncmVnW0NldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXVthY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfYWdncmVnPjEwLF0kYWNjZXB0ZWRfbmFtZSkpCmBgYAoKYGBge3IgZmlnLndpZHRoPTEwLCBmaWcuYXNwPTAuNX0KY29uZGl0aW9ucyA8LSBDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rID09InNwZWNpZXMiCgpwMSA8LSBnZ3Bsb3QoQ2V0YWNlYV9vY2NbY29uZGl0aW9ucyxdLCBhZXMoeD0tYWdlX3J1bmlmKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMC41LCBhbHBoYT0wLjUsIGZpbGw9TkEsIGNvbD0icmVkIikgKwogIHhsaW0oLW1heChDZXRhY2VhX29jY1tjb25kaXRpb25zLF0kYWdlX3J1bmlmKS0xLCAxKSArCiAgeWxpbSgwLCA3MCkgKwogIHRoZW1lX3ZvaWQoKQoKcDIgPC0gZ2dwbG90KENldGFjZWFfb2NjX3NhbXBsZWQsIGFlcyh4PS1hZ2VfcnVuaWYpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjUsIGFscGhhPTAuNSwgZmlsbD0iYmx1ZSIpICsKICB4bGltKC1tYXgoQ2V0YWNlYV9vY2NbY29uZGl0aW9ucyxdJGFnZV9ydW5pZiktMSwgMSkgKwogIHlsaW0oMCwgNzApICsKICB0aGVtZV92b2lkKCkKCnAzIDwtIGdncGxvdChDZXRhY2VhX29jY19hZ2dyZWdbQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIsXSwgYWVzKHg9LWFnZV9ydW5pZikpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDAuNSwgYWxwaGE9MC41LCBmaWxsPSJncmVlbiIpICsKICB4bGltKC1tYXgoQ2V0YWNlYV9vY2NbY29uZGl0aW9ucyxdJGFnZV9ydW5pZiktMSwgMSkgKwogIHlsaW0oMCwgNzApICsKICB0aGVtZV92b2lkKCkKCiMgcDEgKyBhbm5vdGF0aW9uX2N1c3RvbShnZ3Bsb3RHcm9iKHAyKSkgKyBnZ3RpdGxlKCJJbml0aWFsIG9jY3VycmVuY2VzIGRpc3RyaWJ1dGlvbiAocmVkKSBhbmQgY29tcGFyaXNvbiBhZnRlciBzdWItc2FtcGxpbmcgKGJsdWUpIikKIyAKIyBwMSArIGFubm90YXRpb25fY3VzdG9tKGdncGxvdEdyb2IocDMpKSArIGdndGl0bGUoIkluaXRpYWwgb2NjdXJyZW5jZXMgZGlzdHJpYnV0aW9uIChyZWQpIGFuZCBjb21wYXJpc29uIGFmdGVyIGFnZ3JlZ2F0aW5nIGluIGdlb3BsYXRlcyAoZ3JlZW4pIikKCnAxICsgYW5ub3RhdGlvbl9jdXN0b20oZ2dwbG90R3JvYihwMikpICsgYW5ub3RhdGlvbl9jdXN0b20oZ2dwbG90R3JvYihwMykpICsgZ2d0aXRsZSgiSW5pdGlhbCBvY2N1cnJlbmNlcyBkaXN0cmlidXRpb24gKHJlZCkgYW5kIGNvbXBhcmlzb24gYWZ0ZXIgc3ViLXNhbXBsaW5nIChibHVlKSBvciBhZ2dyZWdhdGluZyBpbiBnZW9wbGF0ZXMgKGdyZWVuKSIpCmBgYAoKJFx0byQgRGVsaW1pdGluZyBieSBnZW9sb2dpY2FsIHBsYXRlcyAoKyBhZ2UpIGluc3RlYWQgb2YgY291bnRyaWVzICgrIGFnZSkgbGVhZHMgdG8gc2ltaWxhciBkaXN0cmlidXRpb25zLCBzbyB3ZSB3aWxsIGtlZXAgaXQuCgojIyBDaGVjayB0aGF0IHRoZSBzYW1wbGluZyBtZXRob2RzIGRvIG5vdCBpbnRyb2R1Y2UgYmlhc2VzIGluIHRoZSByZXBhcnRpdGlvbiBiZXR3ZWVuIE9kb250b2NldGkgYW5kIE15c3RpY2V0aQoKTXlzdGVjZXRlcyBhcmUgdXN1YWxseSBsYXJnZXIgdGhhbiBvZG9udG9jZXRlcywgYW5kIHNpemUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgd2lkZXIgZ2VvZ3JhcGhpYyByYW5nZSBzbyBzaW5jZSB3ZSBhcmUgc3Vic2FtcGxpbmcgb2NjdXJyZW5jZXMgYWNjb3JkaW5nIHRvIGdlb2xvZ2ljYWwgZm9ybWF0aW9uIHdlIG1heSBiZSBiaWFzaW5nIG91ciBkYXRhIHRvd2FyZHMgbW9yZSB3aWRlc3ByZWFkIHNwZWNpZXMsIHRoZXJlZm9yZSB0b3dhcmRzIG15c3RlY2V0ZXMuCgpMb29rIGF0IHRoZSBmYW1pbGllcyBmaXJzdDoKCmBgYHtyIGZpZy5oZWlnaHQ9Nn0KZmFtaWxpZXMgPC0gcmJpbmQoQ2V0YWNlYV9vY2MgPSBDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSwKICAgICAgICAgICAgICAgICAgQ2V0YWNlYV9vY2Nfc2FtcGxlZCA9IENldGFjZWFfb2NjX3NhbXBsZWQsCiAgICAgICAgICAgICAgICAgIENldGFjZWFfb2NjX2FnZ3JlZyA9IENldGFjZWFfb2NjX2FnZ3JlZ1tDZXRhY2VhX29jY19hZ2dyZWckYWNjZXB0ZWRfcmFuaz09InNwZWNpZXMiLF0pICU+JQogICAgICAgICAgICB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAiRGF0YXNldCIpCgpmYW1pbGllcyA8LSBmYW1pbGllc1ssYygiRGF0YXNldCIsICJmYW1pbHkiKV0KZmFtaWxpZXMkRGF0YXNldCA8LSBzYXBwbHkoZmFtaWxpZXMkRGF0YXNldCwgZ3N1YiwgcGF0dGVybj0iXFwuLioiLCByZXBsYWNlbWVudD0iIikKCmdncGxvdChmYW1pbGllc1tmYW1pbGllcyRmYW1pbHkgIT0gIk5PX0ZBTUlMWV9TUEVDSUZJRUQiLF0sIGFlcyh4ID0gRGF0YXNldCwgZmlsbCA9IGZhbWlseSkpICsgCiAgICBnZW9tX2Jhcihwb3NpdGlvbj0iZmlsbCIsIGNvbD0iYmxhY2siKQpgYGAKCiRcdG8kIFRoZSBmYW1pbHkgZGlzdHJpYnV0aW9ucyB2YXJ5IGEgYml0IGFmdGVyIHN1YnNhbXBsaW5nLCBidXQgYmVjYXVzZSBvZiB0aGUgbGltaXRlZCBudW1iZXIgb2Ygc3BlY2llcyBieSBmYW1pbHkgdGhlIGZhY3QgdGhhdCB3ZSBjb3JyZWN0ZWQgdGhlIG92ZXJzYW1wbGluZyBvZiBzb21lIHNwZWNpZXMgY291bGQgaGF2ZSBhIGRpc3Byb3BvcnRpb25hdGUgZWZmZWN0LgoKTGV0J3MgbG9vayByYXRoZXIgYXQgYSBoaWdoZXIgdGF4b25vbWljIHJhbmssIGJ5IGltcG9ydGluZyB0aGUgdG9wb2xvZ3kgb2YgY2V0YWNlYW4gZmFtaWxpZXMgKGZyb20gTWFyeCBldCBhbC4gMjAxNik6CgpgYGB7ciBmaWcud2lkdGg9MTAsIGluY2x1ZGU9Rn0KZmFtaWxpZXNfdHJlZSA8LSBhcGU6OnJlYWQudHJlZSgiLi4vYmpvZWxsZS1zdHJhdGlncmFwaGljX2FnZV91bmNlcnRhaW50eV9TSS05YmJjZWYyL2NldGFjZWFuc19kYXRhL2Zvc3NpbHMvZmFtaWxpZXMudHJlIikKZ2d0cmVlKGZhbWlsaWVzX3RyZWUpICsKICBnZW9tX3RpcGxhYigpICsKICBnZW9tX25vZGVsYWIoKSArIAogIGdndGl0bGUoIlRvcG9sb2d5IG9mIGNldGFjZWFuIGZhbWlsaWVzIikgKwogIHhsaW0oMCwgOCkKCmZhbWlsaWVzX3RyZWVfT2RvbnRvY2V0aSA8LSBjYXN0b3I6OmdldF9zdWJ0cmVlX2F0X25vZGUoZmFtaWxpZXNfdHJlZSwgIk9kb250b2NldGkiKSRzdWJ0cmVlCmdndHJlZShmYW1pbGllc190cmVlX09kb250b2NldGkpICsKICBnZW9tX3RpcGxhYigpICsKICBnZW9tX25vZGVsYWIoKSArIAogIGdndGl0bGUoIlRvcG9sb2d5IG9mIG9kb250b2NldGUgZmFtaWxpZXMiKSArCiAgeGxpbSgwLCA1KQoKZmFtaWxpZXNfdHJlZV9NeXN0aWNldGkgPC0gY2FzdG9yOjpnZXRfc3VidHJlZV9hdF9ub2RlKGZhbWlsaWVzX3RyZWUsICJNeXN0aWNldGkiKSRzdWJ0cmVlCmdndHJlZShmYW1pbGllc190cmVlX015c3RpY2V0aSkgKwogIGdlb21fdGlwbGFiKCkgKwogIGdlb21fbm9kZWxhYigpICsgCiAgZ2d0aXRsZSgiVG9wb2xvZ3kgb2YgbXlzdGljZXRlIGZhbWlsaWVzIikgKwogIHhsaW0oMCwgNSkKCmZhbWlsaWVzX3RyZWVfU3RlbSA8LSBjYXN0b3I6OmdldF9zdWJ0cmVlX3dpdGhfdGlwcyhmYW1pbGllc190cmVlLCBvbWl0X3RpcHMgPSBjKGZhbWlsaWVzX3RyZWVfT2RvbnRvY2V0aSR0aXAubGFiZWwsIGZhbWlsaWVzX3RyZWVfTXlzdGljZXRpJHRpcC5sYWJlbCkpJHN1YnRyZWUKZ2d0cmVlKGZhbWlsaWVzX3RyZWVfU3RlbSkgKwogIGdlb21fdGlwbGFiKCkgKwogIGdlb21fbm9kZWxhYigpICsgCiAgZ2d0aXRsZSgiVG9wb2xvZ3kgb2YgYXJjaGVvY2V0ZSBmYW1pbGllcyIpICsKICB4bGltKDAsIDMpCmBgYAoKYGBge3IsIGZpZy5hc3A9MC40LCBmaWcud2lkdGg9OH0KT2RvbnRvY2V0aV9mYW1pbGllcyA8LSBjKGZhbWlsaWVzX3RyZWVfT2RvbnRvY2V0aVtjKCJ0aXAubGFiZWwiLCAibm9kZS5sYWJlbCIpXSwgIktlbnRyaW9kb250aWRhZSIsICJTcXVhbG96aXBoaWlkYWUiKQpNeXN0aWNldGlfZmFtaWxpZXMgPC0gZmFtaWxpZXNfdHJlZV9NeXN0aWNldGlbYygidGlwLmxhYmVsIiwgIm5vZGUubGFiZWwiKV0KYXJjaGFlb2NldGVfZmFtaWxpZXMgPC0gZmFtaWxpZXNfdHJlZV9TdGVtW2MoInRpcC5sYWJlbCIsICJub2RlLmxhYmVsIildCgpmYW1pbHlfdG9fdGF4b25vbWljX2dyb3VwIDwtIGZ1bmN0aW9uKGZhbWlseSl7CiAgcmV0dXJuKGMoIk9kb250b2NldGkiLCAiTXlzdGljZXRpIiwgImFyY2hhZW9jZXRlcyIpWwogICAgZ3JlcChwYXR0ZXJuID0gZmFtaWx5LAogICAgICAgICB4ID0gbGlzdChPZG9udG9jZXRpX2ZhbWlsaWVzLCBNeXN0aWNldGlfZmFtaWxpZXMsIGFyY2hhZW9jZXRlX2ZhbWlsaWVzKSldKQogIH0KCmZhbWlsaWVzJFRheG9ub21pYy5ncm91cCA8LSBhcy5jaGFyYWN0ZXIoc2FwcGx5KGZhbWlsaWVzJGZhbWlseSwgZmFtaWx5X3RvX3RheG9ub21pY19ncm91cCkpCmdncGxvdChmYW1pbGllc1tmYW1pbGllcyRmYW1pbHkgIT0gIk5PX0ZBTUlMWV9TUEVDSUZJRUQiLF0sIGFlcyh4ID0gRGF0YXNldCwgZmlsbCA9IFRheG9ub21pYy5ncm91cCkpICsgCiAgICBnZW9tX2Jhcihwb3NpdGlvbj0iZmlsbCIsIGNvbD0iYmxhY2siKQoKZ2dwbG90KGZhbWlsaWVzW2ZhbWlsaWVzJGZhbWlseSAhPSAiTk9fRkFNSUxZX1NQRUNJRklFRCIgJiBmYW1pbGllcyRUYXhvbm9taWMuZ3JvdXAgIT0gImFyY2hhZW9jZXRlcyIsXSwgYWVzKHggPSBEYXRhc2V0LCBmaWxsID0gVGF4b25vbWljLmdyb3VwKSkgKwogIGdlb21fYmFyKHBvc2l0aW9uPSJmaWxsIiwgY29sPSJibGFjayIpCmBgYAoKJFx0byQgVGhlcmUgaXMgYSBzbWFsbGVyIHByb3BvcnRpb24gb2YgYXJjaGVvY2V0ZSBvY2N1cnJlbmNlcyBhZnRlciBlaXRoZXIgc2FtcGxpbmcsIGJlY2F1c2UgYSBodWdlIGNsdXN0ZXIgaXMgc3Vic2FtcGxlZCBhcm91bmQgMzUgTXkgYWdvLCBidXQgdGhpcyBlZmZlY3QgaXMgZXhwZWN0ZWQuIEhvd2V2ZXIsIGZvciB0aGUgTXlzdGljZXRpIHZzLiBPZG90b2NldGkgdGhlcmUgaXMgbm8gaHVnZSBhcHBhcmVudCBiaWFzLCBlc3BlY2lhbGx5IHdpdGggdGhlIGFnZ3JlZ2F0aW5nIG1ldGhvZC4KCmBgYHtyfQojIHdyaXRlKENldGFjZWFfb2NjX2FnZ3JlZ1tDZXRhY2VhX29jY19hZ2dyZWckYWNjZXB0ZWRfcmFuayA9PSJzcGVjaWVzIixdJGFnZV9ydW5pZiwgCiMgICAgICAgZmlsZSA9ICIuLi9kYXRhLWNldGFjZWFucy9DZXRhY2VhX2FnZV9ydW5pZl9hZ2Vfc3BlY2llc19jb3JyZWN0ZWQuY3N2IiwgCiMgICAgICAgc2VwID0gIjsgIiwgCiMgICAgICAgbmNvbHVtbnMgPSBkaW0oQ2V0YWNlYV9vY2NfYWdncmVnW0NldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9yYW5rID09InNwZWNpZXMiLF0pWzFdKQp3cml0ZS50YWJsZShDZXRhY2VhX29jY19hZ2dyZWdbQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX3JhbmsgPT0gInNwZWNpZXMiLCBjKCJtaW5fbWEiLCAibWF4X21hIildLAogICAgICAgICAgICBmaWxlPSIuLi9kYXRhLWNldGFjZWFucy9DZXRhY2VhX29jY3VycmVuY2VzX21pbl9tYXhfYWdlX3NwZWNpZXNfY29ycmVjdGVkLmNzdiIsIHNlcD0iLCIsIHJvdy5uYW1lcz1GQUxTRSwgY29sLm5hbWVzPUZBTFNFKQoKd3JpdGUudGFibGUoQ2V0YWNlYV9vY2NfYWdncmVnW0NldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9yYW5rICVpbiUgYygic3BlY2llcyIsICJnZW51cyIpLCBjKCJtaW5fbWEiLCAibWF4X21hIildLAogICAgICAgICAgICBmaWxlPSIuLi9kYXRhLWNldGFjZWFucy9DZXRhY2VhX29jY3VycmVuY2VzX21pbl9tYXhfYWdlX3NwZWNpZXNfZ2VuZXJhX2NvcnJlY3RlZC5jc3YiLCBzZXA9IiwiLCByb3cubmFtZXM9RkFMU0UsIGNvbC5uYW1lcz1GQUxTRSkKYGBgCgpgYGB7ciBmaWcuYXNwPTAuMywgZmlnLndpZHRoPTEwfQpnZ3Bsb3QoQ2V0YWNlYV9vY2NfYWdncmVnW0NldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9yYW5rID09ICJzcGVjaWVzIixdLCBhZXMoeD0tYWdlX3J1bmlmLCB5PXJub3JtKGxlbmd0aChhZ2VfcnVuaWYpLCAxLCAwLjAzKSkpICsKICBnZW9tX3BvaW50KGNleD0xLjUsIGFscGhhPTAuNSkgKwogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIlRpbWUgKE15KSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJPY2N1cnJlbmNlcyIsIGxpbWl0cyA9IGMoMC43LCAxLjMpKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJBY2NlcHRlZCByYW5rIikgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoc2l6ZSA9IDAuNSwgbGluZXR5cGUgPSAic29saWQiLCBjb2xvdXIgPSAiYmxhY2siKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKICBnZ3RpdGxlKHBhc3RlKCJSZXBhcnRpdGlvbiBvZiIsIGRpbShjZXRhY2VhX3BiZGIpWzFdLCAicmVjb3JkZWQgb2NjdXJyZW5jZXMgdGhyb3VnaCB0aW1lIikpCmBgYAoKIyBGYXN0ZXIgZ2VudXMtbGV2ZWwgYW5hbHlzaXMKCkFwcGx5IHRoZSBzYW1lIHRyYW5zZm9ybWF0aW9ucyBhdCB0aGUgZ2VuZXJpYyBsZXZlbCB0byBwZXJmb3JtIHRoZSBhbmFseXNpcyBmYXN0ZXIuCgpgYGB7cn0KQ2V0YWNlYV9vY2NfYWdncmVnX2dlbiA8LSBjKCkKCiMgQnJvd3NlIGFsbCBmb3JtYXRpb25zCmZvcm1hdGlvbnMgPC0gbGV2ZWxzKGRyb3BsZXZlbHMoQ2V0YWNlYV9vY2MkZm9ybWF0aW9uKSkKZm9yIChmb3JtIGluIGZvcm1hdGlvbnNbLXdoaWNoKGZvcm1hdGlvbnM9PSIiKV0pewogIENldGFjZWFfb2NjX2Zvcm0gPC0gQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkZm9ybWF0aW9uPT1mb3JtLF0KICAKICAjIEJyb3dzZSBhbGwgZ2VuZXJhIGluIGVhY2ggZm9ybWF0aW9uICYgc2FtcGxlIG9ubHkgMSBvY2N1cnJlbmNlCiAgZ2VuZXJhIDwtIGxldmVscyhkcm9wbGV2ZWxzKENldGFjZWFfb2NjX2Zvcm0kZ2VudXMpKQogIGZvciAoZ2VuIGluIGdlbmVyYSl7CiAgICBDZXRhY2VhX29jY19hZ2dyZWdfZ2VuIDwtIHJiaW5kKENldGFjZWFfb2NjX2FnZ3JlZ19nZW4sIHNhbXBsZV9uKENldGFjZWFfb2NjX2Zvcm1bQ2V0YWNlYV9vY2NfZm9ybSRnZW51cz09Z2VuLF0sIHNpemUgPSAxKSkKICB9Cn0KCiMgR2VuZXJhIGZvciB3aGljaCB0aGUgZ2VvbG9naWNhbCBmb3JtYXRpb24gaXMgbWlzc2luZwojIEJyb3dzZSBhbGwgZ2VvcGxhdGVzCmdlb3BsYXRlcyA8LSBsZXZlbHMoZHJvcGxldmVscyhDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRmb3JtYXRpb249PSIiLF0kZ2VvcGxhdGUpKQpmb3IgKGdwIGluIGdlb3BsYXRlcyl7CiAgQ2V0YWNlYV9vY2NfZ3AgPC0gQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkZm9ybWF0aW9uPT0iIiAmIENldGFjZWFfb2NjJGdlb3BsYXRlPT1ncCxdCiAgCiAgIyBCcm93c2UgYWxsIGVhcmx5IHN0cmF0aWdyYXBoaWMgaW50ZXJ2YWxzCiAgZWFybHlfaW50ZXJ2YWxzIDwtIGxldmVscyhkcm9wbGV2ZWxzKENldGFjZWFfb2NjX2dwJGVhcmx5X2ludGVydmFsKSkKICBmb3IgKGVpIGluIGVhcmx5X2ludGVydmFscyl7CiAgICBDZXRhY2VhX29jY19ncF9laSA8LSBDZXRhY2VhX29jY19ncFtDZXRhY2VhX29jY19ncCRlYXJseV9pbnRlcnZhbD09ZWksXQogICAgCiAgICAjIEJyb3dzZSBhbGwgZ2VuZXJhICYgc2FtcGxlIG9ubHkgMSBvY2N1cnJlbmNlCiAgICBnZW5lcmEgPC0gbGV2ZWxzKGRyb3BsZXZlbHMoQ2V0YWNlYV9vY2NfZ3BfZWkkZ2VudXMpKQogICAgZm9yIChnZW4gaW4gZ2VuZXJhKXsKICAgICAgQ2V0YWNlYV9vY2NfYWdncmVnX2dlbiA8LSByYmluZChDZXRhY2VhX29jY19hZ2dyZWdfZ2VuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlX24oQ2V0YWNlYV9vY2NfZ3BfZWlbQ2V0YWNlYV9vY2NfZ3BfZWkkZ2VudXM9PWdlbixdLCBzaXplID0gMSkpCiAgICB9CiAgfQp9CgpkYXRhLmZyYW1lKENldGFjZWFfb2NjID0gYyhkaW0oQ2V0YWNlYV9vY2MpWzFdLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltKENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgJWluJSBjKCJzcGVjaWVzIiwgImdlbnVzIiksXSlbMV0pLAogICAgICAgICAgIENldGFjZWFfb2NjX2FnZ3JlZ19nZW4gPSBjKGRpbShDZXRhY2VhX29jY19hZ2dyZWdfZ2VuKVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbShDZXRhY2VhX29jY19hZ2dyZWdfZ2VuW0NldGFjZWFfb2NjX2FnZ3JlZ19nZW4kYWNjZXB0ZWRfcmFuayAlaW4lIGMoInNwZWNpZXMiLCAiZ2VudXMiKSxdKVsxXSksCiAgICAgICAgICAgcmVtb3ZlZCA9IGMoZGltKENldGFjZWFfb2NjKVsxXS1kaW0oQ2V0YWNlYV9vY2NfYWdncmVnX2dlbilbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgZGltKENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgJWluJSBjKCJzcGVjaWVzIiwgImdlbnVzIiksXSlbMV0tZGltKENldGFjZWFfb2NjX2FnZ3JlZ19nZW5bQ2V0YWNlYV9vY2NfYWdncmVnX2dlbiRhY2NlcHRlZF9yYW5rICVpbiUgYygic3BlY2llcyIsICJnZW51cyIpLF0pWzFdKSwKICAgICAgICAgICByb3cubmFtZXMgPSBjKCJOdW1iZXIgb2Ygb2NjdXJyZW5jZXMiLCAiTnVtYmVyIG9mIG9jY3VycmVuY2VzIChzcGVjaWVzIGFuZCBnZW5lcmEgb25seSkiKSkKYGBgCgpNb3JlIG9jY3VycmVuY2VzIHJlbWFpbiBhZnRlciBhZ2dyZWdhdGluZyB3aXRoIHRoaXMgbmV3IG1ldGhvZC4gTGV0J3MgY29tcGFyZSBhZ2FpbiB3aXRoIHRoZSB0aGVvcmV0aWNhbCBkaXN0cmlidXRpb246CgpgYGB7ciBmaWcud2lkdGg9MTAsIGZpZy5hc3A9MC40fQojIFJlY291bnQgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyB3aXRoIHRoZSBzYW1lIGdlbnVzIGFmdGVyIHRoZSBhZ2dyZWdhdGlvbgpDZXRhY2VhX29jYyRnZW51c19jb3VudCA8LSBzYXBwbHkoQ2V0YWNlYV9vY2MkZ2VudXMsIGZ1bmN0aW9uKHgpe3RhYmxlKENldGFjZWFfb2NjJGdlbnVzKVt4XX0pCkNldGFjZWFfb2NjX2FnZ3JlZ19nZW4kZ2VudXNfY291bnQgPC0gc2FwcGx5KENldGFjZWFfb2NjX2FnZ3JlZ19nZW4kZ2VudXMsIGZ1bmN0aW9uKHgpe3RhYmxlKENldGFjZWFfb2NjX2FnZ3JlZ19nZW4kZ2VudXMpW3hdfSkKCm9tZWdhIDwtIDAuMwpnZW51c19jb3VudCA8LSBDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rICVpbiUgYygic3BlY2llcyIsICJnZW51cyIpLF0kZ2VudXNfY291bnQKZGVucyA8LSBzYXBwbHkoMTptYXgoZ2VudXNfY291bnQpLCBmdW5jdGlvbihuKXsgZXhwZWN0ZWRfZGlzdHJpYnV0aW9uKG4sIG9tZWdhLCBDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rICVpbiUgYygic3BlY2llcyIsICJnZW51cyIpLF0kc3RyYXRpZ3JhcGhpY19yYW5nZV9kdXJhdGlvbikkdmFsdWUgfSkKZ2VudXNfY291bnRfY2F0ZWdvcmllcyA8LSB0YWJsZShnZW51c19jb3VudCkvYXMubnVtZXJpYyhuYW1lcyh0YWJsZShnZW51c19jb3VudCkpKSAgIyBOdW1iZXIgb2YgY2F0ZWdvcmllcyB3aXRoIDEsIDIsIDMsIC4uLiBvY2N1cnJlbmNlcyBvZiB0aGUgc2FtZSBnZW51cwoKIyBDb21wYXJlIHRoZSBpbml0aWFsIG9ic2VydmVkIGRpc3RyaWJ1dGlvbiB3aXRoIHRoZSB0aGVvcmV0aWNhbCBjdXJ2ZQpnZ3Bsb3QoQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuayAlaW4lIGMoInNwZWNpZXMiLCAiZ2VudXMiKSxdLCAKICAgICAgIGFlcyh4PWdlbnVzX2NvdW50LCAKICAgICAgICAgICB5PWdlbnVzX2NvdW50X2NhdGVnb3JpZXNbYXMuZmFjdG9yKGdlbnVzX2NvdW50KV0sIAogICAgICAgICAgIGZpbGw9YWNjZXB0ZWRfcmFuaykpICsKICBnZW9tX3BvaW50KCkgKwogIAogIGFubm90YXRlKCJsaW5lIiwgeCA9IDE6bWF4KGdlbnVzX2NvdW50KSwgeT0gZGVucwogICAgKm1heCgodGFibGUoZ2VudXNfY291bnQpL2FzLm51bWVyaWMobmFtZXModGFibGUoZ2VudXNfY291bnQpKSkpW2FzLmZhY3RvcihnZW51c19jb3VudCldKSAvbWF4KGRlbnMpKSsKICAKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJOdW1iZXIgb2Ygb2NjdXJyZW5jZXMgYnkgZ2VudXMiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zID0gImxvZzEwIiwgbmFtZSA9ICJOdW1iZXIgb2YgY29ycmVzcG9uZGluZyBnZW5lcmEgKGxvZy1zY2FsZSkiKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJPYnNlcnZlZCBkaXN0cmlidXRpb24iKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKICBnZ3RpdGxlKCJDb21wYXJpc29uIGJldHdlZW4gZXhwZWN0ZWQgYW5kIG9ic2VydmVkIGRpc3RyaWJ1dGlvbnMgb2YgbnVtYmVyIG9mIG9jY3VycmVuY2VzIikKCmdlbnVzX2NvdW50X2FnZ3JlZyA8LSBDZXRhY2VhX29jY19hZ2dyZWdfZ2VuW0NldGFjZWFfb2NjX2FnZ3JlZ19nZW4kYWNjZXB0ZWRfcmFuayAlaW4lIGMoInNwZWNpZXMiLCAiZ2VudXMiKSxdJGdlbnVzX2NvdW50CmRlbnNfYWdncmVnIDwtIHNhcHBseSgxOm1heChnZW51c19jb3VudF9hZ2dyZWcpLCBmdW5jdGlvbihuKXsKICAgICBleHBlY3RlZF9kaXN0cmlidXRpb24obiwgb21lZ2EsIENldGFjZWFfb2NjX2FnZ3JlZ19nZW5bQ2V0YWNlYV9vY2NfYWdncmVnX2dlbiRhY2NlcHRlZF9yYW5rICVpbiUgYygic3BlY2llcyIsICJnZW51cyIpLF0kc3RyYXRpZ3JhcGhpY19yYW5nZV9kdXJhdGlvbikkdmFsdWUKICAgIH0pCgojIE51bWJlciBvZiBjYXRlZ29yaWVzIHdpdGggMSwgMiwgMywgLi4uIG9jY3VycmVuY2VzIG9mIHRoZSBzYW1lIGdlbnVzCmdlbnVzX2NvdW50X2NhdGVnb3JpZXNfYWdncmVnIDwtIHRhYmxlKGdlbnVzX2NvdW50X2FnZ3JlZykvYXMubnVtZXJpYyhuYW1lcyh0YWJsZShnZW51c19jb3VudF9hZ2dyZWcpKSkKCiMgTnVtYmVyIG9mIG9jY3VycmVuY2VzIGJ5IGNhdGVnb3J5CkNldGFjZWFfb2NjX2FnZ3JlZ19nZW4kZ2VudXNfY2F0ZWdvcmllc19jb3VudCA8LSBhcy5udW1lcmljKGdlbnVzX2NvdW50X2NhdGVnb3JpZXNfYWdncmVnW2FzLmZhY3RvcihDZXRhY2VhX29jY19hZ2dyZWdfZ2VuJGdlbnVzX2NvdW50KV0pCgojIENvbXBhcmUgdGhlIGNvcnJlY3RlZCBvYnNlcnZlZCBkaXN0cmlidXRpb24gd2l0aCB0aGUgdGhlb3JldGljYWwgY3VydmUKZ2dwbG90KENldGFjZWFfb2NjX2FnZ3JlZ19nZW5bQ2V0YWNlYV9vY2NfYWdncmVnX2dlbiRhY2NlcHRlZF9yYW5rICVpbiUgYygic3BlY2llcyIsICJnZW51cyIpLF0sIAogICAgICAgYWVzKHg9Z2VudXNfY291bnQsCiAgICAgICAgICAgeT1nZW51c19jYXRlZ29yaWVzX2NvdW50LAogICAgICAgICAgIHNpemU9Z2VudXNfY2F0ZWdvcmllc19jb3VudCkpICsKICBnZW9tX3BvaW50KCkgKwogIAogIGFubm90YXRlKCJsaW5lIiwgeCA9IDE6bWF4KGdlbnVzX2NvdW50X2FnZ3JlZyksIHk9IGRlbnNfYWdncmVnCiAgICAqbWF4KCh0YWJsZShnZW51c19jb3VudF9hZ2dyZWcpL2FzLm51bWVyaWMobmFtZXModGFibGUoZ2VudXNfY291bnRfYWdncmVnKSkpKVthcy5mYWN0b3IoZ2VudXNfY291bnRfYWdncmVnKV0pIC9tYXgoZGVuc19hZ2dyZWcpKSArCiAgCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiTnVtYmVyIG9mIG9jY3VycmVuY2VzIGJ5IGdlbnVzIikgKwogIHNjYWxlX3lfY29udGludW91cyh0cmFucyA9ICJsb2cxMCIsIG5hbWUgPSAiTnVtYmVyIG9mIGNvcnJlc3BvbmRpbmcgZ2VuZXJhIChsb2ctc2NhbGUpIikgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZT0iT2JzZXJ2ZWQgZGlzdHJpYnV0aW9uIikgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpKSArCiAgZ2d0aXRsZSgiQ29tcGFyaXNvbiBiZXR3ZWVuIGV4cGVjdGVkIGFuZCBvYnNlcnZlZCBkaXN0cmlidXRpb25zIG9mIG51bWJlciBvZiBvY2N1cnJlbmNlcywgYWZ0ZXIgYWdncmVnYXRpbmcgaW4gZ2VvcGxhdGVzIikKCmdlbnVzX2NvdW50X2FnZ3JlZyA8LSBDZXRhY2VhX29jY19hZ2dyZWdfZ2VuW0NldGFjZWFfb2NjX2FnZ3JlZ19nZW4kYWNjZXB0ZWRfcmFuayAlaW4lIGMoInNwZWNpZXMiLCAiZ2VudXMiKSxdJGdlbnVzX2NvdW50CmRlbnNfYWdncmVnIDwtIHNhcHBseSgxOm1heChnZW51c19jb3VudF9hZ2dyZWcpLCBmdW5jdGlvbihuKXsKICAgICBleHBlY3RlZF9kaXN0cmlidXRpb24obiwgb21lZ2EsIENldGFjZWFfb2NjX2FnZ3JlZ19nZW5bQ2V0YWNlYV9vY2NfYWdncmVnX2dlbiRhY2NlcHRlZF9yYW5rICVpbiUgYygic3BlY2llcyIsICJnZW51cyIpLF0kc3RyYXRpZ3JhcGhpY19yYW5nZV9kdXJhdGlvbikkdmFsdWUKICAgIH0pCmdlbnVzX2NvdW50X2NhdGVnb3JpZXNfYWdncmVnIDwtIHRhYmxlKGdlbnVzX2NvdW50X2FnZ3JlZykvYXMubnVtZXJpYyhuYW1lcyh0YWJsZShnZW51c19jb3VudF9hZ2dyZWcpKSkgICMgTnVtYmVyIG9mIGNhdGVnb3JpZXMgd2l0aCAxLCAyLCAzLCAuLi4gb2NjdXJyZW5jZXMgb2YgdGhlIHNhbWUgZ2VudXMKYGBgCgokXHRvJCBUaGUgY29ycmVzcG9uZGVuY2UgaXMgbXVjaCBsZXNzIGltcHJvdmVkIHRoYW4gd2l0aCBzcGVjaWVzIGFnZ3JlZ2F0aW9uIGJlY2F1c2Ugc29tZSBnZW5lcmEgaGF2ZSBhIGxvdCBvZiBvY2N1cnJlbmNlcyBkdWUgdG8gdGhlaXIgaGlnaCBudW1iZXIgb2Ygc3BlY2llczoKCmBgYHtyfQp0YWJsZShkcm9wbGV2ZWxzKENldGFjZWFfb2NjX2FnZ3JlZ19nZW5bKENldGFjZWFfb2NjX2FnZ3JlZ19nZW4kYWNjZXB0ZWRfcmFuayAlaW4lIGMoInNwZWNpZXMiLCAiZ2VudXMiKSkgJiAoQ2V0YWNlYV9vY2NfYWdncmVnX2dlbiRnZW51c19jb3VudD4yNSksXSRnZW51cykpCmBgYAoKYGBge3IgZmlnLndpZHRoPTEwLCBmaWcuYXNwPTAuNX0KY29uZGl0aW9ucyA8LSBDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rICVpbiUgYygic3BlY2llcyIsICJnZW51cyIpCgpwMSA8LSBnZ3Bsb3QoQ2V0YWNlYV9vY2NbY29uZGl0aW9ucyxdLCBhZXMoeD0tYWdlX3J1bmlmKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMC41LCBhbHBoYT0wLjUsIGZpbGw9TkEsIGNvbD0icmVkIikgKwogIHhsaW0oLW1heChDZXRhY2VhX29jY1tjb25kaXRpb25zLF0kYWdlX3J1bmlmKS0xLCAxKSArCiAgeWxpbSgwLCAxMDApICsKICB0aGVtZV92b2lkKCkKCnAyIDwtIGdncGxvdChDZXRhY2VhX29jY19zYW1wbGVkLCBhZXMoeD0tYWdlX3J1bmlmKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMC41LCBhbHBoYT0wLjUsIGZpbGw9ImJsdWUiKSArCiAgeGxpbSgtbWF4KENldGFjZWFfb2NjW2NvbmRpdGlvbnMsXSRhZ2VfcnVuaWYpLTEsIDEpICsKICB5bGltKDAsIDEwMCkgKwogIHRoZW1lX3ZvaWQoKQoKcDMgPC0gZ2dwbG90KENldGFjZWFfb2NjX2FnZ3JlZ19nZW5bQ2V0YWNlYV9vY2NfYWdncmVnX2dlbiRhY2NlcHRlZF9yYW5rICVpbiUgYygic3BlY2llcyIsICJnZW51cyIpLF0sIGFlcyh4PS1hZ2VfcnVuaWYpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjUsIGFscGhhPTAuNSwgZmlsbD0iZ3JlZW4iKSArCiAgeGxpbSgtbWF4KENldGFjZWFfb2NjW2NvbmRpdGlvbnMsXSRhZ2VfcnVuaWYpLTEsIDEpICsKICB5bGltKDAsIDEwMCkgKwogIHRoZW1lX3ZvaWQoKQoKIyBwMSArIGFubm90YXRpb25fY3VzdG9tKGdncGxvdEdyb2IocDIpKSArIGdndGl0bGUoIkluaXRpYWwgb2NjdXJyZW5jZXMgZGlzdHJpYnV0aW9uIChyZWQpIGFuZCBjb21wYXJpc29uIGFmdGVyIHN1Yi1zYW1wbGluZyAoYmx1ZSkiKQojIAojIHAxICsgYW5ub3RhdGlvbl9jdXN0b20oZ2dwbG90R3JvYihwMykpICsgZ2d0aXRsZSgiSW5pdGlhbCBvY2N1cnJlbmNlcyBkaXN0cmlidXRpb24gKHJlZCkgYW5kIGNvbXBhcmlzb24gYWZ0ZXIgYWdncmVnYXRpbmcgaW4gZ2VvcGxhdGVzIChncmVlbikiKQoKcDEgKyBhbm5vdGF0aW9uX2N1c3RvbShnZ3Bsb3RHcm9iKHAzKSkgKyBhbm5vdGF0aW9uX2N1c3RvbShnZ3Bsb3RHcm9iKHAyKSkgKyBnZ3RpdGxlKCJJbml0aWFsIG9jY3VycmVuY2VzIGRpc3RyaWJ1dGlvbiAocmVkKSBhbmQgY29tcGFyaXNvbiBhZnRlciBzdWItc2FtcGxpbmcgKGJsdWUpIG9yIGFnZ3JlZ2F0aW5nIGluIGdlb3BsYXRlcyAoZ3JlZW4pIikKYGBgCgokXHRvJCBEZWxpbWl0aW5nIGJ5IGdlb2xvZ2ljYWwgcGxhdGVzICgrIGFnZSkgaW5zdGVhZCBvZiBjb3VudHJpZXMgKCsgYWdlKSBsZWFkcyB0byBzaW1pbGFyIGRpc3RyaWJ1dGlvbnMsIHdpdGggYSBiaXQgbW9yZSBvY2N1cnJlbmNlcy4KCmBgYHtyfQp3cml0ZS50YWJsZShDZXRhY2VhX29jY19hZ2dyZWdfZ2VuW0NldGFjZWFfb2NjX2FnZ3JlZ19nZW4kYWNjZXB0ZWRfcmFuayAlaW4lIGMoInNwZWNpZXMiLCAiZ2VudXMiKSwgYygibWluX21hIiwgIm1heF9tYSIpXSwKICAgICAgICAgICAgZmlsZT0iLi4vZGF0YS1jZXRhY2VhbnMvQ2V0YWNlYV9vY2N1cnJlbmNlc19taW5fbWF4X2FnZV9nZW5lcmFfY29ycmVjdGVkLmNzdiIsIHNlcD0iLCIsIHJvdy5uYW1lcz1GQUxTRSwgY29sLm5hbWVzPUZBTFNFKQpgYGAKCiMgQ29uY2x1c2lvbnMKClNldmVyYWwgYmlhc2VzIGFmZmVjdCB0aGUgY2V0YWNlYW4gZm9zc2lsIHJlY29yZDoKCiAgLSBCSUFTIDE6IFZlcnkgcmVjZW50IHNhbXBsZXMgbWF5IGhhdmUgYmVlbiBkYXRlZCB3aXRoIGEgbW9yZSBwcmVjaXNlIG1ldGhvZCBhbmQgY29udGFpbiBtdWNoIG1vcmUgZm9zc2lscywgc28gdGhleSBzaG91bGQgYmUgcmVtb3ZlZCBvciB0cmVhdGVkIHNlcGFyYXRlbHkKICAtIEJJQVMgMjogU29tZSBvY2N1cnJlbmNlcyBzaG93IGEgaGlnaGx5IHVuY2VydGFpbiBkYXRpbmcgKD4gMTBNeSksIHRoZXkgYXJlIGV4Y2x1ZGVkIHdoZW4gY29tYmluaW5nIHRoZSB1bmNlcnRhaW50eSBpbnRlcnZhbHMgaW50byBhIHVuaXF1ZSBzdHJhdGlncmFwaGljIHJhbmdlIHBlciB0YXhvbgogIC0gQklBUyAzOiBTb21lIHRheGEgYW5kIGdlb2xvZ2ljYWwgcGVyaW9kcyBzZWVtcyB0byBoYXZlIGJlZW4gb3ZlcnNhbXBsZWQsIGR1ZSB0byB2YXJpYXRpb24gaW4gc3BlY2llcyBhYnVuZGFuY2UsIGdlb2xvZ2ljYWwgZmFjdG9ycyBvciBodW1hbiB1bmVxdWFsIHNhbXBsaW5nLCAKICAgIDEuIEl0IHNlZW1zIHBvc3NpYmxlIHRvIGFkZXF1YXRlbHkgcmVkdWNlIHRoZSBhYnVuZGFuY2UgYmlhcyBieSBzdWJzYW1wbGluZyB0aGUgcmljaGVzdCB0YXhhLCBiYXNlZCBvbiBhIG1ldHJpY3Mgb2Ygb2NjdXJyZW5jZSBkZW5zaXR5IChudW1iZXIgb2Ygb2NjdXJyZW5jZXMgLyBzdHJhdGlncmFwaGljIHJhbmdlKS4gVXNpbmcgY29tYmluZWQgc3RyYXRpZ3JhcGhpYyByYW5nZXMsIGluc3RlYWQgb2YgYWdlIHVuY2VydGFpbnR5IGludGVydmFscywgYXBwZWFycyB0byBiZSBtb3JlIHJvYnVzdAogICAgMi4gQW4gYWx0ZXJuYXRpdmUgc2FtcGxpbmcgbWV0aG9kIGNvbnNpc3RpbmcgaW4gYWdncmVnYXRpbmcgdGhlIG9jY3VycmVuY2VzIG9mIHRoZSBzYW1lIHRheGEgZm91bmQgaW4gdGhlIHNhbWUgZ2VvbG9naWNhbCBmb3JtYXRpb24gKG9yIHRoZSBzYW1lIGdlb3BsYXRlICsgZWFybHkgc3RyYXRpZ3JhcGhpYyBpbnRlcnZhbCBpZiB0aGUgZ2VvbG9naWNhbCBmb3JtYXRpb24gaXMgbm90IGluZGljYXRlZCkgc2VlbXMgdG8gd29yayBlcXVhbGx5IHdlbGwsIGFuZCBpcyBtb3JlIHBhbGVvbnRvbG9naWNhbGx5IHJlbGV2YW50CiAgICAKICAgIA==